John Siracusa wrote:

> 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.

There *is* a way to do the latter. In A12, Larry implies that the declarators in the body of a class definition are actually method calls on an instance of MetaClass:

http://www.perl.com/pub/a/2004/04/16/a12.html?page=3#use_of_classes
http://www.perl.com/pub/a/2004/04/16/a12.html?page=19#new_grammatical_categories

So, presumably, by defining a new C<scope_declarator:has>, you would be able to override the default accessor-generating behaviour.

The least scary way to do this would be to encapsulate it in a trait that is applied to (and has its way with ;- the class declaration:

    class Dog is getset {
        has $.name is rw;
        ...
    }

or perhaps is applied instead to individual attribute declarations:

    class Dog {
        has $.name is getset;
        ...
    }


Alternatively, you could just *cheat* and define a macro (putting it in a lexically-scoped module for convenience and safety):

module GetSet;

    macro getset is export(:MANDATORY)
                 is parsed(rx:words/ <?Perl6.type>? <?Perl6.attr_var>/)
                 ($attr)
    {
        my $accessor = substr $attr{attr_var}, 2;
        return "method set_$accessor ($attr{type} $attr{$attr_var}) {} "
             ~ "method get_$accessor () { return $attr{attr_var} } "
             ~ "has $attr{type} $attr{attr_var}"
             ;
    }

and then:

    class Dog {
        use GetSet;
        getset $.name;
        ...
    }


Damian




Reply via email to