Benoît
Benoît

Reputation: 3543

How do I list available methods on a given object or package in Perl?

How do I list available methods on a given object or package in Perl?

Upvotes: 46

Views: 22136

Answers (5)

xcodejoy
xcodejoy

Reputation: 50

A good answer from How to get structure and inheritance history
The classes from which an object's class currently inherits can be found using the following:

use mro          qw( );
use Scalar::Util qw( blessed );
say join ", ", @{ mro::get_linear_isa(blessed($o)) };

Upvotes: 1

Chris Lutz
Chris Lutz

Reputation: 75389

If you have a package called Foo, this should do it:

no strict 'refs';
for(keys %Foo::) { # All the symbols in Foo's symbol table
  print "$_\n" if exists &{"Foo::$_"}; # check if symbol is method
}
use strict 'refs';

Alternatively, to get a list of all methods in package Foo:

no strict 'refs';
my @methods = grep { defined &{"Foo::$_"} } keys %Foo::;
use strict 'refs';

Upvotes: 26

Nic Gibson
Nic Gibson

Reputation: 7143

There are (rather too) many ways to do this in Perl because there are so many ways to do things in Perl. As someone commented, autoloaded methods will always be a bit tricky. However, rather than rolling your own approach I would suggest that you take a look at Class::Inspector on CPAN. That will let you do something like:

my $methods =   Class::Inspector->methods( 'Foo::Class', 'full', 'public' );

Upvotes: 40

Kent Fredric
Kent Fredric

Reputation: 57344

if you have a package that is using Moose its reasonably simple:

print PackageNameHere->meta->dump;

And for more complete data:

use Data::Dumper;
print Dumper( PackageNameHere->meta ); 

Will get you started. For everything else, theres the methods that appear on ->meta that are documented in Class::MOP::Class

You can do a bit of AdHoc faking of moose goodness for packages without it with:

use Class::MOP::Class;
my $meta = Class::MOP::Class->initialize( PackageNameHere );

and then proceed to use the Class::MOP methods like you would with Moose.

For starters:

 $meta->get_method_map(); 

use Moose; #, its awesome.

Upvotes: 13

brian d foy
brian d foy

Reputation: 132719

In general, you can't do this with a dynamic language like Perl. The package might define some methods that you can find, but it can also make up methods on the fly that don't have definitions until you use them. Additionally, even calling a method (that works) might not define it. That's the sort of things that make dynamic languages nice. :)

What task are you trying to solve?

Upvotes: 3

Related Questions