> Date: Thu, 12 Dec 2002 16:26:28 -0500
> From: John Siracusa <[EMAIL PROTECTED]>
> 
> On 12/12/02 4:01 PM, Larry Wall wrote:
> > On Thu, Dec 12, 2002 at 12:40:52PM -0600, Garrett Goebel wrote:
> > : So we'll _have_ to write $obj.*id when we mean $obj->UNIVERSAL::id;
> > 
> > If you wish to be precise, yes.  But $a.id eq $b.id should work for most any
> > class that uses the the term "id" in the typical fashion.
> 
> I still feel like we're talking past each other here.  What I was saying is
> that, regardless of any admonitions to the contrary, I think people will
> still write this:
> 
>     $a.id == $b.id
> 
> and expect it to compare memory addresses.  

And presumably, anyone who overrides .id in their own class knows what
they're doing.  They, in fact, I<want> statements like that to behave
that way.  Junction, by delegation, will override that method to
return a junction of the .ids of its states.

Speaking of which, how do you code delegation? 

    class Disjunction is Junction {
        has @.states is public;
        # ...
        # Use the class's AUTOLOAD?
        method AUTOLOAD($name, *@args) {
            any(map { $_.$name.(*@args) } @.states);
        }
        
        # Or use some kind of DELEGATE method, taking a curried
        # function with only the invocant left blank.
        method DELEGATE(&func) {
            any(map { $_.&func } @.states);
        }
    }

I rather like the latter.

Luke

Reply via email to