sub can { my ( $proto, $method ) = @_; my ($callpack) = caller(0); my $class = ref $proto || $proto; if ( my $coderef = $proto->SUPER::can($method) ) { return $coderef if 'can' eq $method; my $code_package = $package_for->($coderef); if ( $class->isa($code_package) && ('_' ne substr($method, 0, 1) || $callpack->isa($code_package)) ) { return $coderef; } } return; }