Comment répertorier les méthodes disponibles sur un objet ou un package donné en Perl?
Réponses
Trop de publicités?Il y a (plutôt trop) de nombreuses façons de le faire en Perl car il y a tellement de façons de faire les choses en Perl. Comme quelqu'un l'a commenté, les méthodes chargées automatiquement seront toujours un peu délicates. Cependant, plutôt que de rouler votre propre approche, je vous suggère de jeter un œil à Class :: Inspector sur CPAN. Cela vous permettra de faire quelque chose comme:
my @methods = Class::Inspector->methods( 'Foo::Class', 'full', 'public' );
Si vous avez un paquet appelé Foo, cela devrait le faire:
no strict 'refs';
for(keys %Foo::) { # All the symbols in Foo's symbol table
print "$_\n" if defined &{$_}; # check if symbol is method
}
use strict 'refs';
Alternativement, pour obtenir une liste de toutes les méthodes:
no strict 'refs';
my @methods = grep { defined &{$_} } keys %Foo::;
use strict 'refs';
si vous avez un package à l'aide de l'Orignal son assez simple:
print PackageNameHere->meta->dump;
Et pour des informations plus complètes:
use Data::Dumper;
print Dumper( PackageNameHere->meta );
Vous permettra de commencer. Pour tout le reste, il y a les méthodes qui apparaissent sur ->meta
sont documentées dans la Classe::MOP::Classe
Vous pouvez faire un peu de AdHoc semblant de moose bonté pour les forfaits sans avec:
use Class::MOP::Class;
my $meta = Class::MOP::Class->initialize( PackageNameHere );
et puis faire usage de la Classe::MOP méthodes comme vous le feriez avec l'Orignal.
Pour commencer:
$meta->get_method_map();
l'utilisation de l'Orignal; #, à son génial.
En général, vous ne pouvez pas faire cela avec un langage dynamique comme Perl. Le package peut définir certaines méthodes que vous pouvez trouver, mais il peut également créer à la volée des méthodes qui n'ont pas de définitions jusqu'à ce que vous les utilisiez. De plus, même appeler une méthode (qui fonctionne) peut ne pas la définir. C'est le genre de choses qui rendent les langages dynamiques agréables. :)
Quelle tâche essayez-vous de résoudre?