"Joe Gottman" <[EMAIL PROTECTED]> writes: > ----- Original Message ----- > From: "Luke Palmer" <[EMAIL PROTECTED]> > To: <[EMAIL PROTECTED]> > Sent: Tuesday, January 06, 2004 4:51 AM > Subject: [perl] Re: Roles and Mix-ins? > > >> David Storrs writes: >> > >> > On Sat, Dec 13, 2003 at 11:12:31AM -0800, Larry Wall wrote: >> > > On Sat, Dec 13, 2003 at 04:57:17AM -0700, Luke Palmer wrote: >> > >> > > : For one, one role's methods don't silently override another's. > Instead, >> > > : you get, er, role conflict and you have to disambiguate yourself. >> > >> > How do you disambiguate? >> >> Let's see... >> >> role Dog { >> method bark() { print "Ruff!" } >> } >> role Tree { >> method bark() { print "Rough!" } >> } >> class Trog >> does Dog does Tree { >> method bark() { .Dog::bark() } >> } >> } >> >> Perhaps something like that. In any case, you do it by putting the >> offending method directly in the aggregating class. >> > > How about something like > class Trog > does Dog {bark=>dogBark} does Tree {bark=>treeBark} > {...} > > Then we could have code like > my Trog $foo = Trog.new(); > my Dog $spot := $foo; > my Tree $willow := $foo; > $spot.bark(); # calls dogBark() > $willow.bark(); #calls treeBark() > > This works better when Dog::bark and Tree::bark are both needed but they > do different things.
I'm really not happy with the idea that simply using a typed variable should change the way a method call on that variable is dispatched. You seem to be saying that class Parent { override { "Parent" }} class Child is Parent { override { "Child" }} my $kid = Child.new; my Parent $dad := $kid; print $kid.override; # "Child" print $dad.override; # "Parent" And down that road lies C++ and other insanity. -- Beware the Perl 6 early morning joggers -- Allison Randal