On Aug 17, 2005, at 2:28 PM, Ingo Blechschmidt wrote:
Hi,
Stevan Little wrote:
So, onto my question, I am wondering what are the valid scopes for
$?SELF and $?CLASS.
Are these (magical) globals who only have bound values in certain
contexts? If that is so, what value do they have outside of a valid
context? undef? or is attempting to accessing the value a runtime
exception?
hm, I've thought of these as follows:
class Foo {...} # is really
class Foo {
my $?CLASS := Foo;
...;
}
method bar($self:) {...} # is really
method bar($self:) {
my $?SELF := $self;
...;
}
Yes, this is how I saw it too.
The obvious one is that they are both valid within a method. I asumme
that $?SELF is bound to the invocant, and $?CLASS is bound to the
class the method was defined within. It seems to me that this also
mean that in a class method, that $?SELF == $?CLASS?
I think so, too.
Also (IIRC) we discussed $?CLASS being valid inside a class Foo { ...
} block at the hackathon. Would mean that something like this should
be possible.
class FooLoggerProxy is Foo {
has Logger $.logger;
for ($?CLASS.meta.superclasses()) -> $super {
for ($super.meta.getmethods()) -> $method {
$?CLASS.meta.add_method($method.label => method {
$?SELF.logger.log($method.label ~ " has been
called"); return $method.do([EMAIL PROTECTED])
});
}
}
}
I'd opt for yes.
I am not sure if there are any other valid contexts other than inside
a method or a class composition block. At least none that I can think
of.
role, submethod?
I think in a Role, $?SELF would still be the invocant in a method, and
$?CLASS would (eventually) bind to the class the role was composed
into.
As for submethods, I see them like this:
submethod foo () { ... }
is really ..
submethod foo () {
next METHOD unless $?SELF ~~ $?CLASS;
}
At least that is how larry explained to me about a month ago.
Stevan
--Ingo
--
Linux, the choice of a GNU | Mathematicians practice absolute freedom.
generation on a dual AMD | -- Henry Adams
Athlon! |