On Thu Apr 16 06:23:35 2009, masak wrote:
> OH HAI from NPW::2009.
> 
> In Rakudo 2c13d6c, the 'handles' instruction on attributes in roles
> don't override those of the class it mixes in.
> 
> $ perl6 -e 'class A { method foo { say "OH HAI" }; method aie { say
> "AIE!" } }; role B { has A $.bar handles * }; class C does B { has A
> $.bar handles "foo" }; C.new.aie'
> Could not locate a method 'aie' to invoke on class 'C'.
> [...]
> 
> I don't think that the above case is mentioned in the spec, but by the
> principle of mixins adding attributes consistent with the existing
> ones, the above should dispatch to A.aie(), instead of failing.
> 
> By the same token, I guess the following should actually be an error:
> 
> $ perl6 -e 'class A { method foo { say "OH HAI" }; method aie { say
> "AIE!" } }; role B { has A $.bar handles "aie" }; class C does B { has
> A $.bar handles "foo" }; C.new.aie'
> AIE!
> 
> Finally, if the two 'handles' RHSes were regular expressions instead
> of strings, I guess all bets are off and we should fail just in case.
> At least unless we can introspect regexes.

The reasoning is a bit off here. Attributes declared in roles are meant to 
behave much like if they were declared in the class itself. That means that 
you'd be declaring two attributes $!bar in both of these examples. This today 
does indeed correctly report a conflict - for both of the code examples.

That did leave the issue that we had no tests for if wildcard and literal 
handles on attributes in roles took effect. I wrote some tests to check they 
do, and indeed that works out. See the tests added to S14-roles/composition.t 
in 5a0c386 for the details.

Reply via email to