In Perl 5, "caller EXPR" returns undef if the caller is top-level code. If
you need it, you can still get file, line, and package information
(this last is important for "import" subs) by using "caller" with the
EXPR-less form.

How do you do that in Perl 6? I'd been working with this presumed
signature:

     multi sub caller (Class ?$kind = Any, Int +$skip = 0, Str +$label)
             returns Control::Caller is primitive is export is safe { ... }

And an implementation which *always* expected a VCode frame (to check
$kind against). Obviously, this leaves no way to peek at frames with no
&?SUB, i.e., the top level.

The hacky way to solve this is to stipulate that kind=>Any actually
means something so general that it matches things that are not VCode
at all. The cleaner way in terms of formalism is to allow $kind to be
undef (actually, *default* to it), in which case it functions as that
wider-than-Any qualifier.

I'd go with the second way, since I think it leaves us with DWIMmy
usage. This will start working, which is good:

     sub import() {     # (do we still have that?)
         die "I'm not speaking with you!" if caller().package ~~ Rival;
        ...
     }

Anyone spot any problems?

-- 
Gaal Yahas <[EMAIL PROTECTED]>
http://gaal.livejournal.com/

Reply via email to