On Tue, 2005-05-03 at 05:33, Thomas Sandlaß wrote: > Luke Palmer wrote: > >>BTW, what does $.foo outside of class scope mean?
> > It means: > > BEGIN { die "Can't use \$.foo outside of class scope"; } > > That contradicts $Larry's statement: "By the way, this probably goes along > with a policy of allowing $.foo, @.foo, and %.foo outside of the class as > well. > These would not refer to the actual attribute, but would call $self.foo() > underneath (except in the class that actually defines the attribute)." > > OK, he has got a 'probably' there. Would it be the one character saver > $.foo == $_.foo outside class scope, $.foo == $?SELF.foo in methods > of derived (or even unrelated?) classes and direct access to the instance > variable in the class scope that has the corresponding 'has $.foo' > declaration? If it's ever $_, then you have the problem where the code: given $someobj { when $.foo {...} } gets wrapped in a method later in the project: class X { method y { given $someobj { when $.foo {...} } } } Now you have two options: either it's ALWAYS $?SELF.foo because it's inside a method (and thus, this code is now wrong), or it's only $?SELF.foo if X or any ancestor has a $.foo, otherwise it's $_.foo. I like the idea that $.foo ALWAYS means the $.foo in the current class. Anything else gets very ugly later on. On a side note about auto-accessors, if I say: class X { has $.foo; } class Y is X { has %.foo; } What happens to the accessors for X.foo? If there's no current plan, my suggestion would be that every auto-accessor has an alias of the form "TYPE_NAME". That is, these hold true: has $foo; # Gets .Any_foo has int $foo; # Gets .int_foo has @foo; # Gets .Array_foo has @foo is MyArray; # Gets .MyArray_foo has $foo does X; # Hmmm... probably just .Any_foo These should be automatically overridden by explicit method declarations in this OR an ancestor class (to avoid mysterious bugs when you forget that your "$.foo" is going to override your Any_foo method that has nothing to do with an accessor), but should override inherited auto-accessors... which of course means having to keep track of why a method was created in the metaclass, but I don't think that's too hard. -- Aaron Sherman <[EMAIL PROTECTED]> Senior Systems Engineer and Toolsmith "It's the sound of a satellite saying, 'get me down!'" -Shriekback