On 2012.04.08, at 21:31, Ovid wrote:

> Hi all,
> 
> I'm wondering if this is a known bug or a misunderstanding on my part (I 
> assume the latter):
> 
>     use 5.10.0;
>     { package Role::A; use Moose::Role; with 'Role::C'; }
>     { package Role::B; use Moose::Role; with 'Role::C'; }
>     { package Role::C; use Moose::Role; with 'Role::D'; }
>     {
>         package Role::D;
>         use Moose::Role;
> 
>         sub foo {
>             my $proto = shift;
>             my $class = ref $proto // $proto;
>             return "$class\::foo";
>         }
>     }
>     package Consume;
>     use Moose;
>     with qw(Role::A Role::B);
>     say Moose->VERSION;
>     say Consume->foo;
> 
> That prints out:
> 
>     2.0402
>     Can't locate object method "foo" via package "Consume" at roles.pl line 
> 19.
>  
> Given that Role::C uses Role::D and the latter provides the 'foo()' method, 
> that method should be provided to both Role::A and Role::B since they each 
> consume Role::C. When consuming those roles, the Consume class should then 
> have the 'foo()' method, but it does not.
> 
> Did I misunderstand something? (For the curious, my Role::Basic module has 
> the same bug).
> 

To me it seems you're having a "conflict" - foo() is available in both Role::A 
and Role::B, and you the consuming class Consume should resolve it by 
implementing the method foo() itself. It can use combinations of method 
exclusion and aliasing.

Now, in your (short) example, Role::D::foo acts the same way, but imaging foo() 
invoked something that was different in Role::A and Role::B, then Consume's 
foo() has to decide what is the wanted version of foo()...

Hope that this helps.

regards
Poul Sørensen
Basefarm AS

Reply via email to