On Wed, Jul 15, 2009 at 11:24:11AM -0700, Ovid wrote:
> Consider the following code. Now that the role provides an attribute named 
> "counter" and the class using the role provides a method of the same name.  
> The methods are not semantically equivalent, so I had two expectations, 
> possibly due to me misunderstanding Moose:
> 
> 1.  The class method would silently override the role attribute.
> 2.  This code would break horribly.
> 
>     #!/usr/bin/env perl -l
> 
>     {
>         package MyRole;
>         use Moose::Role;
>         has counter => ( is => 'rw', default => 0 );
> 
>         sub inc {
>             my $self = shift;
>             $self->counter( $self->counter + 1 );
>             return $self->counter;
>         }
>     }
>     {
>         package Foo;
>         use Moose;
>         with 'MyRole';
>         sub counter { 'this is the counter' }
>     }
>     my $foo = Foo->new;
>     print $foo->inc for 1 .. 5;
>     print $foo->counter;
> 
> However, my expectations were wrong.  Here's the output when run:
> 
>     1
>     2
>     3
>     4
>     5
>     5
> 
>  
> In other words, the class's counter() method was silently discarded, denying 
> the class the ability to control its behavior.

We actually just discussed this in #moose yesterday, it's mostly an
artifact of the role implementation not really being quite complete -
attributes in roles don't *really* exist until they're added to a class,
and at that point have no concept that they actually came from a role.
This is hopefully something that will be addressed when the attributes
in roles system is redone (I think Yuval has a plan for this?)

Jesse

Reply via email to