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.)
|