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; }