Как мне перечислить доступные методы для данного объекта или пакета в Perl? - PullRequest
39 голосов
/ 26 мая 2009

Как мне перечислить доступные методы для данного объекта или пакета в Perl?

Ответы [ 4 ]

37 голосов
/ 26 мая 2009

Существует множество способов сделать это в Perl, потому что в Perl существует множество способов. Как кто-то прокомментировал, автозагрузка методов всегда будет немного хитрой. Однако вместо того, чтобы использовать собственный подход, я бы посоветовал вам взглянуть на Class :: Inspector в CPAN. Это позволит вам сделать что-то вроде:

my $methods =   Class::Inspector->methods( 'Foo::Class', 'full', 'public' );
21 голосов
/ 26 мая 2009

Если у вас есть пакет с именем Foo, он должен это сделать:

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';

Кроме того, чтобы получить список всех методов:

no strict 'refs';
my @methods = grep { defined &{$_} } keys %Foo::;
use strict 'refs';
12 голосов
/ 26 мая 2009

, если у вас есть пакет, который использует Moose , это довольно просто:

print PackageNameHere->meta->dump;

А для более полных данных:

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

Начну. Для всего остального есть методы, которые появляются в ->meta и документированы в Class :: MOP :: Class

Вы можете немного подделать AdHoc фальшивого лося для пакетов без него с помощью:

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

и затем перейдите к использованию методов Class :: MOP, как это было бы с Moose.

Для начала:

 $meta->get_method_map(); 

использовать Moose; #, его офигенно .

4 голосов
/ 26 мая 2009

В общем, вы не можете сделать это с динамическим языком, таким как Perl. Пакет может определять некоторые методы, которые вы можете найти, но он также может создавать методы на лету, у которых нет определений, пока вы их не используете. Кроме того, даже вызов метода (который работает) может не определить его. Именно такие вещи делают динамические языки приятными. :)

Какую задачу вы пытаетесь решить?

...