| Safe-Caller documentation | Contained in the Safe-Caller distribution. |
Safe::Caller - A nicer interface to the built-in caller()
package abc;
use Safe::Caller;
$caller = Safe::Caller->new;
a();
sub a { b() }
sub b {
print $caller->{subroutine}->();
if ($caller->called_from_subroutine('abc::a')) { # do stuff }
}
$caller = Safe::Caller->new(1);
Supplying how many frames to go back while running caller in perlfunc is optional.
By default (if no suitable value is supplied) 1 will be assumed. The default
will be shared among all method calls (accessors & verification routines);
the accessors may optionally accept a frame as parameter, whereas verification
routines (called_from_*()) don't.
$caller->{package}->();
$caller->{filename}->();
$caller->{line}->();
$caller->{subroutine}->();
$caller->{hasargs}->();
$caller->{wantarray}->();
$caller->{evaltext}->();
$caller->{is_require}->();
$caller->{hints}->();
$caller->{bitmask}->();
See caller in perlfunc for the values they are supposed to return.
Checks whether the current sub was called within the appropriate package.
$caller->called_from_package('main');
Returns 1 on success, 0 on failure.
Checks whether the current sub was called within the appropriate filename.
$caller->called_from_filename('foobar.pl');
Returns 1 on success, 0 on failure.
Checks whether the current sub was called on the appropriate line.
$caller->called_from_line(13);
Returns 1 on success, 0 on failure.
Checks whether the current sub was called by the appropriate subroutine.
$caller->called_from_subroutine('foo');
Returns 1 on success, 0 on failure.
caller in perlfunc, Perl6::Caller, Devel::Caller, Sub::Caller
Steven Schubiger <schubiger@cpan.org>
This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself.
| Safe-Caller documentation | Contained in the Safe-Caller distribution. |
package Safe::Caller; use strict; use warnings; use Carp qw(croak); our $VERSION = '0.08'; use constant FRAMES => 1; sub new { my ($self, $frames) = @_; $frames ||= FRAMES; my $caller = sub { my ($f, $elem) = @_; my $frames = defined $f ? $f : $frames; return (caller($frames + 2))[$elem] || ''; }; # all fields required because we need to maintain backwards compatibility my @sets = (['package','pkg'], ['filename', 'file'], 'line', ['subroutine', 'sub'], 'hasargs', 'wantarray', 'evaltext', 'is_require', 'hints', 'bitmask'); my $i = 0; my %map; foreach my $set (@sets) { foreach my $lookup (ref $set eq 'ARRAY' ? @$set : $set) { $map{$lookup} = $i; } $i++; } my $accessors = {}; foreach my $type (keys %map) { $accessors->{$type} = sub { my $frames = shift; return $caller->($frames, $map{$type}) }; } $accessors->{_frames} = $frames; return bless $accessors, ref($self) || $self; } sub called_from_package { my ($self, $called_from_package) = @_; croak 'usage: $caller->called_from_package(\'PACKAGE\');' unless defined $called_from_package; return $self->{package}->() eq $called_from_package ? 1 : 0; } sub called_from_filename { my ($self, $called_from_filename) = @_; croak 'usage: $caller->called_from_filename(\'file\');' unless defined $called_from_filename; return $self->{filename}->() eq $called_from_filename ? 1 : 0; } sub called_from_line { my ($self, $called_from_line) = @_; croak 'usage: $caller->called_from_line(13);' unless defined $called_from_line && $called_from_line =~ /^\d+$/; return $self->{line}->() eq $called_from_line ? 1 : 0; } sub called_from_subroutine { my ($self, $called_from_subroutine) = @_; croak 'usage: $caller->called_from_subroutine(\'sub\');' unless defined $called_from_subroutine; return $self->{subroutine}->($self->{_frames} + 1) eq $called_from_subroutine ? 1 : 0; } # backwards compatibility (deprecated) *called_from_pkg = \&called_from_package; *called_from_file = \&called_from_filename; *called_from_sub = \&called_from_subroutine; 1; __END__