David Green wrote: > Or to look at it the other way around: Since we refer to things by name, > those names have to be unique everywhere; so let's start out with long, > "fully-qualified" names everywhere: $dog.Dog::bark(), $tree.Tree::bark(), > $i.Int::succ, etc. Now everything's fine -- except that our fingers are > getting tired from all that typing. We want to use shortcuts to say things > like $dog.bark, because there's only one place that $dog can legitimately > find a bark() method, and that's in the Dog class, so both we and Perl can > easily figure out what is meant. > > On the other hand, $dogwood.Dog::bark cannot be simplified by leaving out > the "Dog::" because then it would be ambiguous. But if we look at it as > starting with full names everywhere, and seeing what we can leave out > (rather that starting with short names and having to add stuff in), I think > it's not surprising.
On the gripping hand, if we have a function "train(Dog $d)", then we can safely assume that within the lexical scope of train, $d is supposed to be treated as a Dog. So within that lexical scope, it should be safe to leave off the "Dog::". If you pass $dogwood into this method, the ambiguity between Dog::bark and Tree::bark gets resolved in favor of the former; so $d.bark _still_ barks like a Dog, even though $d is actually a Dogwood. That's what I was meaning when I talked about wearing hats: while it's within the train() sub, $dogwood is wearing its Dog hat and barks like a Dog. >> I really don't think that deferring the decision works. The "freezing" >> technique described in the paper allows the consumer, C, to statically bind >> the method foo() in the methods in the appropriate role which call it. > > The problem with "freezing" some methods into private ones is that those > methods weren't meant to be private; if my role provides a .bark method, I > need to be able to call it. And more to the point, subs that aren't expecting a Dogwood should still be able to accept it in its role as a Dog, call .bark, and expect it to bark like a Dog. -- Jonathan "Dataweaver" Lang