In short, you can't:

    #!/usr/bin/env perl -l

    {
        package My::Role;
        use Moose::Role;
        use Memoize;

        memoize('foo');
        sub foo { __PACKAGE__ }
    }
    {
        package My::Class;
        use Moose;
        with 'My::Role';
    }
    print My::Class->foo;

If you comment out the 'memoize(foo)' line, it works fine.  This is because 
methods/subs not defined in the role itself will not be composed into your 
class.  memoize() rewrites the method and thus the 'foo' method is defined in 
the Memoize module.

This clearly is not a bug, but it's a surprising behavior.  I'd hate to have to 
put the memoize(foo) call into all classes which consume the role.  Thus, it 
would be nice if there was either a special case (yuck) for Memoize or that 
Moose provides something similar.

Side note: for Moose::Manual::Role, 'brake' is misspelled as 'break' in the Car 
example.  I know why it was done this way, but a better example would be nice :)

 
Cheers,
Ovid
--
Buy the book         - http://www.oreilly.com/catalog/perlhks/
Tech blog            - http://use.perl.org/~Ovid/journal/
Twitter              - http://twitter.com/OvidPerl
Official Perl 6 Wiki - http://www.perlfoundation.org/perl6

Reply via email to