On 11 August 2016 at 15:43, Niall Young <ni...@iinet.net.au> wrote:
> Not sure how your example applies here Karen, there is no foo() declared in
> MyClass only a foo method modifier, and MyRole's foo() doesn't appear to be
> executed from your output?


In the example she gave, the point was not to call MyRole's foo, only
to replace it. ( Because Roles prohibit replacement by default, its a
conflict that must be manually resolved )

Hence, "around foo"  wraps MyRole::foo and *creates*  MyClass::foo
without the conflict.

If one wants to call MyRole::foo in the new MyClass::foo, this is done:

    package MyClass;
    use Moose;
    with 'MyRole';
    around foo => sub {
       my ( $orig, $self, @args );
       return join q[, ],  'I came from the class', $self->$orig( @args );
    };


This would print

  "I came from the class, I came from the role"

Noting that:

"$orig" is the "wrapped" sub, MyRole::foo

That calling it is optional, and you can call it anywhere in the wrapper.

That you can intercept its return value, and modify its arguments
before calling.


-- 
Kent

KENTNL - https://metacpan.org/author/KENTNL

Reply via email to