Aaron Sherman <[EMAIL PROTECTED]> writes:
> On Wed, 2005-05-18 at 10:51, Luke Palmer wrote:
>
>> Except that mixins like this always treat things as "virtual".
>> Whenever you mixin a role at runtime, Perl creates an empty, anonymous
>> subclass of the current class and mixes the role in that class. Since
>> roles beat superclasses, you'll always override your own methods.
>
> Ok, good point (I've even pointed that out to others before, and I
> missed it)...
>
> I know that's the way it works, but now it's really bothering me.
>
> There are many gotchas that fall out of that. For example, you might
> have a special role that overrides .print to handle structured data, so
> your code says:
>
> my Foo $obj;
> given $obj {
> when StructuredPrintRole {
> # Someone's already taken care of it, possibly
> # adding a more specialized role, so leave it
> # alone.
> }
> default {
> # Add in a boring default handler
> $obj does StructuredPrintRole
> }
> }
> $obj.print($structured_data);
>
> Woefully, you lose is Foo happens to be DECLARED with
> StructuredPrintRole, and it overrode print. But, if it just inherited a
> print(), then it works. In other words, this code will mysteriously fail
> the second someone innocently adds a print method to Foo!
>
> Action at a distance... my head hurts.
Aaron, you do realise that that's quite obscene code don't you? I mean, you're
doing a case statement based on the type of its topic, and to compound the
evils, you're changing how your topic's print method works *everywhere* simply
to get your 'special' print behaviour. If you must do something like this (and
call it print), then write it as a multimethod or something.