On Sat, 12 Oct 2002, Larry Wall wrote:
> On Sat, 5 Oct 2002, John Williams wrote:
> : Personally, I hope they look like attributes.
>
> They will, outside the class anyway.  Inside it's $.foo.
>
> : But if they do, the perl5
> : lvalue subs are not the way to do it.  Why?  Because an lvalue sub returns
> : a lvalue which get set _after_ the sub returns.  At that point it is too
> : late for the sub to do anything useful with the new value.
>
> Lvalue methods will have some kind of optional property which specifies
> a closure to execute after the modification happens.
>
>     method foo {
>       my $handle = find_database("random criteria");
>       return $handle.fetch();
>
>       WRITE {
>           $handle.store(shift);
>       }
>     }
>
> Or some such.  Note how the internal block allows capture of the $handle from
> the original closure.   (A READ closure was also discussed in Zurich.)

That looks good.  I was actually imagining some sort of tie-like routine
which would be called whenever the variable was accessed.

   method foo is accessor ($stuff_i_might_need_to_know, $new_value) {
      if exists($new_value) {
         ...
         $.foo = $new_value;
      }
      ...
      return $.foo;
   }

lvalue methods still seem to work in reverse to me though.  If I say
   $x = $object.foo = $y;
then first an lvalue accessor returns an object to receive the value of
$y.  Next the write (oh by the way...) closure is called.  Finally the
value of $y is passed on to $x, but its too late for foo to change its
mind about what its own value will be if something in write{} caused the
collapse of its quantum state.

An accessor like the above could return a different value than it was
given, which would admittedly be an odd thing to do, but perl users being
what they are, someone would think of a reason to do it.

By the way, which apocalypse will describe how properties work?
It seems like they will need some similar way of "taking control" when a
variable or value (or method or class or whatever) is accessed.

~ John Williams


Reply via email to