On 4/19/04 3:58 PM, Austin Hastings wrote:
>> I initially decide to accept the default accessors.
>> 
>>     $dog.name = 'Ralph';
>>     print $dog.age;
>> 
>> This works well for a while, but then I decide to update Dog so that setting
>> the name also sets the gender.
>> 
>>     $dog.name = 'Susie'; # also sets $dog.gender to 'female'
>> 
>> How do I write such a name() method?
>
> has $.name is rw
> will STORE { .set_name($^name); };

The "will STORE" stuff covers the easy cases, but can I extend it all the
way up to a name() that's a multimethod with a ton of optional args?  I
supposed you can (technically) do all of that with "will STORE", but it
seems an odd place for what would more naturally be code in the name()
method itself.

> You can leave the "name" attribute around as a placeholder and let the STORE
> block update the "official" location, or you could return some sort of
> proxy-lvalue object that wasn't really a part of Dog

Heh, getting progressively more scary :)

>From the point of view of the person coding the new, fancier name() method,
it would be nice if some magic would make all existing calls to

    $dog.name = 'foo';

look like this inside the new name() method

    $dog.name('foo');

but I supposed that really hoses the meaning of "=" :)

The alternate techniques suggested are powerful, but they also strike me as
slightly heroic.  I can imaging using them to patch or extend some existing
code, but starting a Perl 6 class from scratch, I'd really have to think
about the costs of using the default accessors at all.

One work-around might be an alternate kind of default accessor that doesn't
allow assignment:

    $dog.name         # get
    $dog.name('foo')  # set
    $dog.name = 'foo' # compile-time error

That is a lot more directly (and simply) "future-proof" than the "is rw"
accessor.

I'd either like a way to more cleanly extend the default accessor's
assignment behavior down the road (i.e. by just writing a new name() method,
not by hacking away at STORE traits and adding private worker subs) or a way
to auto-generate the slightly more "boring" default accessor shown above.

I'd prefer the former since I'm hoping to avoid the likes of
Class::MethodMaker as long as possible in the world of Perl 6 :)

In the absence of both, I can imaging that 5 years into the life of 6PAN, a
substantial portion of the Perl 6 modules will have STORE hooks on what they
originally thought would be "simple" attributes that don't need full-blown
accessors... :)

-John

Reply via email to