Update 1: Oops. Seems that Christian Lembark has the permission rights to the caller namespace. Working around that now.
Update 2: Turns out that he has a 'package caller' declaration in his FindBin::libs module. Thus, he owns that namespace.
I've just uploaded Perl6::Caller. If you read this and it's not on the CPAN, just wait a few hours. Feedback and bug reports gratefully accepted. I had to do a couple of weird things to get it to work and I decided that, at least for the first release, to not allow optional overriding of CORE::GLOBAL::caller. Relevant docs:
NAME
Perl6::Caller - OO "caller()" interface
VERSION
Version 0.01
SYNOPSIS
use Perl6::Caller;
my $sub = caller->subroutine;
my $line_number = caller->line;
my $is_require = caller(3)->is_require;
EXPORT
"caller"
# standard usage
print "In ", caller->subroutine,
" called from ", caller->file,
" line ", caller->line;
# get a caller object
my $caller = caller;
my $caller = caller(); # same thing
# get a caller object for a different stack from
my $caller = caller(2); # two stack frames up
print $caller->package; # prints the package name
# enjoy the original flavor
my @caller = caller; # original caller behavior
print $caller[0], # prints the package name
DESCRIPTION
This module is experimental. It's also alpha. Bug reports and patches
welcome.
By default, this module exports the "caller" function. This
automatically returns a new "caller" object. An optional argument
specifies how many stack frames back to skip, just like the
"CORE::caller" function. This lets you do things like this:
print "In ", caller->subroutine,
" called from ", caller->file,
" line ", caller->line;
If you do not wish the "caller" function imported, specify an empty
import list and instantiate a new "Perl6::Caller" object.
use Perl6::Caller ();
my $caller = Perl6::Caller->new;
print $caller->line;
Note: if the results from the module seem strange, please read
perldoc -s caller carefully. It has stranger behavior than you might be
aware.
METHODS
The following methods are available on the "caller" object. They return
the same values as documented in perldoc -f caller.
There are no "hints" and "bitmask" methods because those are documented
as for internal use only.
* "package"
* "filename"
* "line"
* "subroutine"
* "hasargs"
* "wantarray"
* "evaltext"
* "is_require"
Note that each of these values will report correctly for when the caller
object was created. For example, the following will probably print
different line numbers:
print caller->line;
foo();
sub foo {
print caller->line;
}
However, the following will print the *same* line numbers:
my $caller = Perl6::Caller->new; # everything is relative to here
print $caller->line;
foo($caller);
sub foo {
my $caller = shift;
print $caller->line;
}
CAVEATS
Most of the time, this package should *just work* and not interfere with
anything else.
* $hints, $bitmask
'hints' and 'bitmask' are not available. They are documented to
be for internal use only and should not be relied upon. Further, the
bitmask caused strange test failures, so I opted not to include
them.
* "caller" package
To make this work, we actually use the 'caller' package in addition
to the "Perl6::Caller" package.
* Subclassing
Don't.
* Perl 6
I'm not entirely comfortable with the namespace. The Perl 6 caller
actually does considerably more, but for me to have a hope of
working that in, I need proper introspection and I don't have that.
Thus, I've settled for simply having a caller object.
* *CORE::GLOBAL::caller
I didn't implement this, though I was tempted. It turns out to be a
bit tricky in spots and I'm very concerned about globally overriding
behavior. I might change my mind in the future if there's enough
demand.
* Overloading
In string context, this returns the package name. This is to support
the original "caller" behavior.
* List Context
In list context, we simply default to the original behavior of
"CORE::caller". However, this *always* assumes we've called caller
with an argument. Calling "caller" and caller(0) are identical with
this module. It's difficult to avoid since the stack frame changes.
Re:Just curious, but...
Ovid on 2007-04-21T20:34:24
I don't. In the first (unreleased) version, I was having some serious issues with caller->line being called as a class method at times, but as caller()->line at other times (things got very strange which is part of why CORE::GLOBAL::caller has not been overridden). I can't quite work out how I got there, but I separated the namespace to make this work. Now I've fixed that and version 0.04 should be uploaded soon. Thanks for the prodding.