Beta Shell
v2.0 ยท web2.us.cloudlogin.co
[FM]
[CMD]
[PHP]
[DB]
[INFO]
[SEC]
File Manager
~
/
usr
/
share
/
perl5
/
vendor_perl
/
Perl6
Upload
3 items
Name
Size
Perms
Modified
Actions
[ .. / .. ]
Caller.pm
5.42 KB
-rw-r--r--
2019-11-07 15:41:39
Edit
Del
Editing: Caller.pm
(5.42 KB)
Path: /usr/share/perl5/vendor_perl/Perl6/Caller.pm
Back
package Perl6::Caller; use warnings; use strict; our $VERSION = '0.100'; $VERSION = eval $VERSION; use overload '""' => \&package, fallback => 1; sub import { my ($class) = @_; my $callpack = caller; no strict 'refs'; *{"$callpack\::caller"} = \&caller; } sub caller { my $thing = shift || 0; my $frame = __PACKAGE__ eq $thing ? ( shift || 0 ) : $thing; return __PACKAGE__->new($frame); } my @methods; BEGIN { @methods = qw/package filename line subroutine hasargs wantarray evaltext is_require/; foreach my $method (@methods) { no strict 'refs'; *$method = sub { my ( $self, $frame ) = @_; return $self->{$method}; }; } } sub new { my $class = shift; my $frame = @_ ? (shift || 0) : -1; $frame += 2; my $self = bless {} => __PACKAGE__; my @caller = CORE::caller($frame); return @caller if CORE::wantarray; @$self{@methods} = @caller; return $self; } 1; __END__ =head1 NAME Perl6::Caller - OO C<caller()> interface =head1 VERSION Version 0.04 =cut =head1 SYNOPSIS use Perl6::Caller; my $sub = caller->subroutine; my $line_number = caller->line; my $is_require = caller(3)->is_require; =head1 EXPORT =head1 C<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 =head1 DESCRIPTION This module is experimental. It's also alpha. Bug reports and patches welcome. By default, this module exports the C<caller> function. This automatically returns a new C<caller> object. An optional argument specifies how many stack frames back to skip, just like the C<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 C<caller> function imported, specify an empty import list and instantiate a new C<Perl6::Caller> object. use Perl6::Caller (); my $caller = Perl6::Caller->new; print $caller->line; B<Note>: if the results from the module seem strange, please read S<perldoc -s caller> carefully. It has stranger behavior than you might be aware. =head1 METHODS The following methods are available on the C<caller> object. They return the same values as documented in S<perldoc -f caller>. There are no C<hints> and C<bitmask> methods because those are documented as for internal use only. =over 4 =item * C<package> =item * C<filename> =item * C<line> =item * C<subroutine> =item * C<hasargs> =item * C<wantarray> =item * C<evaltext> =item * C<is_require> =back 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 I<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; } =cut =head1 CAVEATS Most of the time, this package should I<just work> and not interfere with anything else. =over 4 =item * C<$hints>, C<$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. =item * Subclassing Don't. =item * Perl 6 I'm not entirely comfortable with the namespace. The S<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. =item * C<*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. =item * Overloading In string context, this returns the package name. This is to support the original C<caller> behavior. =item * List Context In list context, we simply default to the original behavior of C<CORE::caller>. However, this I<always> assumes we've called caller with an argument. Calling C<caller> and C<caller(0)> are identical with this module. It's difficult to avoid since the stack frame changes. =back =head1 AUTHOR Curtis "Ovid" Poe, C<< <ovid@cpan.org> >> =head1 ACKNOWLEDGEMENTS Thanks to C<phaylon> for helping me revisit a bad design issue with this. =head1 BUGS Please report any bugs or feature requests to C<bug-perl6-caller@rt.cpan.org>, or through the web interface at L<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. =head1 ACKNOWLEDGEMENTS =head1 COPYRIGHT & LICENSE Copyright 2007 Curtis "Ovid" Poe, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.