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