Mark J. Reed writes:
> Let me just chime in with my support for John's basic idea. I would
> definitely prefer that it be easy to arrange things such that
>
> $obj.foo = 'bar'
>
> winds up invoking a method on $obj with 'bar' as an argument, rather
> than invoking a method on $obj that returns an lvalue to which
> 'bar' is then assigned. (Yes, like Ruby's def foo=; I have a Rubyometer
> and I'm not afraid to use it!) It doesn't need to be the default
> rw accessor behavior, but I would like it to be accomplishable without
> jumping through a lot of hoops.
Okay, well, I thought that my example did that, but apparently using
C<will get> and C<will set> is a little too complex... (my sentiments
are beginning to follow Larry's, in that I'm not sure you know what you
want -- perhaps you could give a hypotheical syntax?)
So, what you really want is a way so that:
$obj.foo = 'bar';
Is translated into:
$obj.foo('bar');
When you get rid of C<$.foo> and replace it with a C<foo> method.
This is doable (without a syntax munge), but it requires some
cleverness. First I'll do it by hand, then I'll wrap it up in a trait.
Please realize that all this I'm doing is an *implementation* of a very
easy usage.
class Dog {
class :FooProxy {
has $.method;
multi sub infix:= (FooProxy $proxy, Any $val) {
$.method($val);
}
}
method foo_call (?$arg) {
# accessor code here
}
method foo ($self:) is rw {
FooProxy.new(method => { $self.foo_call($_) })
}
}
That should turn:
$obj.foo = 'bar';
Into:
$obj.foo('bar');
And now we want to wrap that up so we can just say C<is accessor>:
role accessor {
class :Proxy {
has $.method;
multi sub infix:= (Proxy $proxy, Any $val) {
$.method($val);
}
}
multi sub trait_auxiliary:is (accessor $a, &code is rw: ?$arg) {
my sub access (::_ $self:) {
Proxy.new(method => { code($self: $_) })
}
&code = &access;
}
}
There. Now here's the important part: in order to *use* all this, you
import whatever module defines it, and then say:
class Dog {
method foo (?$arg) is accessor {
# accessor code here
}
}
If that's not easy enough for you, well, you're probably out of luck.
Luke