On Tue, Jul 7, 2009 at 2:48 AM,
Ovid<[email protected]> wrote:
>
> Giving a talk about roles at YAPC::EU in Lisbon and I'm a bit stuck on how to
> translate a Perl 5 example into Perl 6. Basically, Imagine a "PracticalJoke"
> class which has fuse() and explode methods(). It needs the timed fuse() from
> a Bomb role and a non-lethal explode() from a Spouse role, though each role
> provides both methods. In Moose, it's easy:
>
> package PracticalJoke;
> use Moose;
> with 'Bomb' => { excludes => 'explode' };
> 'Spouse' => { excludes => 'fuse' };
>
> Try as I might, I can't figure out how to translate that into Perl 6. I have
> the following:
>
> role Bomb {
> method fuse () { say '3 .. 2 .. 1 ..' }
> method explode () { say 'Rock falls. Everybody dies!' }
> }
>
> role Spouse {
> method fuse () { sleep rand(20); say "Now!" }
> method explode () { say 'You worthless piece of junk! Why I should ...' }
> }
>
> class PracticalJoke does Bomb does Spouse {
> }
>
> Nothing I see in S14 (http://perlcabal.org/syn/S14.html) seems to cover this
> case. I can't declare them as multis as they have the same signature.
> There's a note that one can "simply to write a class method that overrides
> the conflicting role methods, perhaps figuring out which role method to
> call", but I don't understand how a particular role's methods would be called
> here.
>
I believe that the official word is to say:
class PracticalJoke does Bomb does Spouse {
method fuse () { Bomb::fuse }
method explode () { Spouse::explode }
}
Personally, I agree that some sort of ability to exclude individual
methods from Roles, such as what Moose does, would be beneficial; but
this is an old argument that has been hashed out many times before.
--
Jonathan "Dataweaver" Lang