To find the package in which the method was found:
use mro qw( );
use Scalar::Util qw( blessed );
sub get_package {
my ($obj, $method_name) = @_;
defined( my $class = blessed($obj) )
or return undef;
for my $pkg_name (@{ mro::get_linear_isa($class) }) {
my $pkg = do {
no strict qw( refs );
*{ $pkg_name.'::'.$method_name }
};
return $pkg_name if *{$pkg}{CODE};
}
return undef;
}
Note: Doesn't work if the method is autoloaded.
To find the package in which the method was compiled:
use B qw( svref_2object );
sub get_package {
my ($obj, $method_name) = @_;
my $method_ref = $obj->can($method_name)
or return undef;
return svref_2object($method_ref)->GV->STASH->NAME;
}
Note: Only works for autoloaded methods if can is properly overridden.
Note: Works for methods implemented in XS.
To find the file in which the method was compiled:
use B qw( svref_2object );
sub get_package {
my ($obj, $method_name) = @_;
my $method_ref = $obj->can($method_name)
or return undef;
return svref_2object($method_ref)->FILE;
}
Note: Only works for autoloaded methods if can is properly overridden.
Note: Only works well for Perl methods. For methods implemented in XS, it returns the name of the .c file with no path. For example, returns XS.c for JSON::XS->encode. (This may vary by system, and by XS loader.)
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.