On 11 April 2014 12:59, Thalhammer, Jeffrey Ryan <
j...@imaginative-software.com> wrote:

> From memory, consume the interface/interface-role after all other
> declarations and role consumption, e.g.
>
> I get that. Here’s an example:
>
> package FooRole;
> use Moose::Role;
>
> requires qw(open close read write);
>
> requires qw(eenie meenie);
>
> #----------------------------------------------
>
> package FooWrapper;
> use Moose;
>
> has delegate => (
>     is => 'ro',
>     isa => 'Foo',
>     handles => [ qw(open close read write) ],
>     required => 1,
> );
>
> sub eenie {...}
> sub meenie {...}
>
> with qw(FooRole);
>
> That only works if the with comes after the delegation has been
> established. The trouble is, I only want to write that list qw(open close
> read write) once. I could put that in say, @FooRole::METHODS_TO_DELEGATE.
> But
> that variable probably won’t be available to me until *after* FooRole has
> been loaded by the with. At that point, it is too late, and it won’t
> compile because the class hasn’t satisfied the role.
>
Given the example, considering you want to do that in more than one place,
is there a reason why you don't instead have a role that you compose in for
that attribute?


package FooRole;
use Moose::Role;

requires qw(open close read write);

requires qw(eenie meenie);

#----------------------------------------------
package DelegatedAttribute;

use Moose::Role;

has delegate => (
    is => 'ro',
    isa => 'Foo',
    handles => [ qw(open close read write) ],
    required => 1,
);
#---------------------------------
package FooWrapper;
use Moose;


sub eenie {...}
sub meenie {...}
with qw(DelegatedAttribute);
with qw(FooRole);


?

If you wanted you could make that parametrizable so that the attribute name
wasn't fixed, but the delegates it provided were.

-- 
Kent

Reply via email to