Re: Moo: inheritance conflicting with role composition?

[email protected] (Graham Knop) Wed, 07 Jan 2015 15:42:53 -0500
Newsgroups perl.moose
Message-ID <[email protected]>
On 1/7/15 2:18 PM, Diab Jerius wrote:
> Hi!
> 
> I've attached some example code which exhibits (to my thinking) an
> unexpected collision between inheritance and composition. I'm using
> Moo v. 1.006001.
> 
> There is a base role (R0) which provides a method, track().
> 
> The role is consumed by another role (R1) which is consumed by a class
> (C1), each of which modifies track().
> 
> C1->new->track exhibits the correct series of modifications.
> 
> C2 is a class which inherits from C1 and also modifies track().
> 
> C2->new->track also exhibits the correct behavior with regard to the
> modifications.
> 
> C3 is a class which inherits from C1, modifies track(), and consumes R0.
> 
> C3->new->track seems to completely ignore its parent class.
> 
> The code outputs the packages whose modification was performed.  I'm
> getting this
> 
> C1:     R1    C1
> C2:     R1    C1    C2
> C3:     C3
> 
> I expected the result for C3 to be
> 
> C3:     R1    C1    C3
> 
> The order of C3's consumption of R0 and extension of C1 doesn't change
> the results.
> 
> What confuses me is that track() calls up the inheritance chain, so
> that any version of track() which ends up in C3 should know enough to
> call C1's track, and thus see the modifications made at that level.
> 
> Please let me know if I'm missing something here!
> 
> Thanks,
> 
> Diab
> 

The problem here is that you are trying to call the superclass of a
role.  next::method and its brethren don't work in roles.  If the role
wants to call the superclass of whatever class it is consumed by, it
needs to use an around modifier.