{ no strict 'refs'; @my_subs = grep exists &{ 'Some::Module::' . $_ }, keys %Some::Module::; } #### use strict; use warnings; sub get_subs { my $pkg = shift; my $subs = shift || +{}; my $seen = shift || +{}; return if $seen->{ $pkg }++; my $pkg_and_dots = $pkg . '::'; my @ancestors; { no strict 'refs'; $subs->{ $_ } ||= $pkg for grep exists &{ "$pkg_and_dots$_" }, keys %{ $pkg_and_dots }; @ancestors = @{ "${pkg_and_dots}ISA" }; } @ancestors = 'UNIVERSAL' unless @ancestors || $seen->{ UNIVERSAL }; get_subs( $_, $subs, $seen ) for @ancestors; return $subs; } sub Foo::baz { 1 } @Bar::ISA = 'Foo'; my $subs = get_subs( 'Bar' ); __END__ #### 'VERSION' => 'UNIVERSAL' 'baz' => 'Foo' 'can' => 'UNIVERSAL' 'isa' => 'UNIVERSAL'