VERSION

Version 0.04

SYNOPSIS

 use Perl6::Caller;

 my $sub         = caller->subroutine;
 my $line_number = caller->line;
 my $is_require  = caller(3)->is_require;

EXPORT

# 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 \*(C`caller\*(C' function. This automatically returns a new \*(C`caller\*(C' object. An optional argument specifies how many stack frames back to skip, just like the \*(C`CORE::caller\*(C' 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 \*(C`caller\*(C' function imported, specify an empty import list and instantiate a new \*(C`Perl6::Caller\*(C' 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 \*(C`caller\*(C' object. They return the same values as documented in perldoc -f caller.

There are no \*(C`hints\*(C' and \*(C`bitmask\*(C' methods because those are documented as for internal use only.

  • \*(C`package\*(C'

  • \*(C`filename\*(C'

  • \*(C`line\*(C'

  • \*(C`subroutine\*(C'

  • \*(C`hasargs\*(C'

  • \*(C`wantarray\*(C'

  • \*(C`evaltext\*(C'

  • \*(C`is_require\*(C'

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.

  • 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 \*(C`caller\*(C' behavior.

  • List Context In list context, we simply default to the original behavior of \*(C`CORE::caller\*(C'. However, this always assumes we've called caller with an argument. Calling \*(C`caller\*(C' and caller(0) are identical with this module. It's difficult to avoid since the stack frame changes.

AUTHOR

Curtis \*(L"Ovid\*(R" Poe, \*(C`<[email protected]>\*(C'

ACKNOWLEDGEMENTS

Thanks to \*(C`phaylon\*(C' for helping me revisit a bad design issue with this.

BUGS

Please report any bugs or feature requests to \*(C`[email protected]\*(C', or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Perl6-Caller <http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Perl6-Caller>. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

ACKNOWLEDGEMENTS

COPYRIGHT & LICENSE

Copyright 2007 Curtis \*(L"Ovid\*(R" Poe, all rights reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.