Search code examples
perlreflectionperl-modulesubroutine

What's the best way to discover all subroutines a Perl module has?


What's the best way to programatically discover all of the subroutines a perl module has? This could be a module, a class (no @EXPORT), or anything in-between.

Edit: All of the methods below look like they will work. I'd probably use the Class::Sniff or Class::Inspector in production. However, Leon's answer is marked as 'accepted' since it answers the question as posed, even though no strict 'refs' has to be used. :-) Class::Sniff may be a good choice as it progresses; it looks like a lot of thought has gone into it.


Solution

  • sub list_module {
        my $module = shift;
        no strict 'refs';
        return grep { defined &{"$module\::$_"} } keys %{"$module\::"}
    }
    

    ETA: if you want to filter out imported subroutines, you can do this

    use B qw/svref_2object/;
    
    sub in_package {
        my ($coderef, $package) = @_;
        my $cv = svref_2object($coderef);
        return if not $cv->isa('B::CV') or $cv->GV->isa('B::SPECIAL');
        return $cv->GV->STASH->NAME eq $package;
    }
    
    sub list_module {
        my $module = shift;
        no strict 'refs';
        return grep { defined &{"$module\::$_"} and in_package(\&{*$_}, $module) } keys %{"$module\::"}
    }