class Dog { has $.foo will FETCH { ... } will STORE { ... } ; }
I'm not saying there is anything wrong with that, but John Siracusa is asking for something different, I think. A simple accessor which looks like a method without having to play with Proxy, FETCH, STORE, etc. If it still looks like $obj.foo = 1 outside the class, that's good too. (Delphi and C# can do it; why can't we?)
C# does it as
public int buffersize { get { return my_buffer.length(); } set { //[1] double sqrt=Math.sqrt(value); //value is a keyword in C# // because of this feature. if(Math.floor(sqrt) == sqrt) { my_buffer=new byte[value]; } else { throw new InvalidArgumentException( "Value is not a power of two" ); } } }
How different is that from:
method buffersize() will fetch { +$.buffer.bytes } will store { my $sqrt=$^v.sqrt; die "$^v is not a power of two" unless int($sqrt) == $sqrt; $.buffer = "\x[0]" x $^v; } {}
Or even (my suggestion):
method buffersize() will store { my $sqrt=$^v.sqrt; die "$^v is not a power of two" unless int($sqrt) == $sqrt; $.buffer = "\x[0]" x $^v; } { +$.buffer.bytes }
?
Of course, the best way to implement that would probably be something like:
our type Buffer ::= ByteString where { int sqrt +.bytes == sqrt +.bytes }; has Buffer $.buffer;
But that's neither here nor there...
[1] I'm certain there's a more efficient way to do this test, probably involving bit twiddling. Whatever.
-- Brent "Dax" Royal-Gordon <[EMAIL PROTECTED]> Perl and Parrot hacker
Oceania has always been at war with Eastasia.