use 5.010;
use mro; # Make next::can available.
use Sub::Name (); # Used to make next::can work
# in anonymous subroutines.
sub AUTOLOAD {
my ($bottom_class, $method) = $AUTOLOAD =~ /(.*)::(.*)/s;
# Note the /s above. It's legal to have
# newlines in packages and symbols.
my $next = Sub::Name::subname(
$method => sub { $bottom_class->next::can }
)->();
goto &$next if $next;
...;
}
####
my %known_method;
my @classes = ($bottom_class);
while (@classes) {
my $class = shift @classes;
next if $class eq __PACKAGE__;
unshift @classes, @{"$class\::ISA"};
for my $name (keys %{"$class\::"}) {
next unless defined &{"$class\::$name"};
$known_method{$name} ||= $class;
}
}
##
##
use Devel::Symdump;
my %known_method =
reverse
map /(.*)::(.*)/s,
map Devel::Symdump::->functions($_),
grep $_ ne __PACKAGE__,
@{mro::get_linear_isa($class)}
;