On 7/11/05, Ingo Blechschmidt <[EMAIL PROTECTED]> wrote:
> class Foo {
> has $.data;
> method incr () { $.data++ }
>
> # Please fill in appropriate magic here
> }
>
> my Foo $x .= new(:data(42));
> my Foo $y = $x;
> $y.incr();
> say $x.data; # Should still be 42
> say $x =:= $y; # Should be false
Whoops, I didn't read that carefully enough. You shouldn't mutate
inside a value type (the body of incr() is a no-no). Ideally, it
should be implemented like so:
class Foo is value {
has $.data;
method succ () { $.data + 1 }
}
my $x = Foo.new(data => 42);
my $y = $x;
$y.=succ;
...
Then you don't need any special magic. But if you want to have
mutator methods that aren't in .= form (which I recommend against for
value types), maybe the `is value` trait makes the class do the
`value` role, which gives you a method, `value_clone` or something,
with which you specify that you're about to mutate this object, and
that Perl should do any copying it needs to now.
Luke