Chargement dynamique de modules

Chargement dynamique de modules - Perl - Programmation

Marsh Posté le 13-02-2008 à 09:13:35    

En Perl, comment peut-on charger dynamiquement (à l'exécution) un module et instancier la classe qu'il représente ?
 
Conrètement j'ai une classe A dont héritent plusieurs classes B, C, D. Mes classes filles B, C, D. sont en fait des "plugins" qui implémentent l'interface décrite par A. Je ne les connais pas au moment où j'écris le code ; je voudrais pouvoir, à l'éxécution, charger dynamiquement tous les modules B.pm, C.pm, D.pm, présents dans un répertoire donné, et créer une instance des classes B, C, D.
 
J'ai vu qu'il existe un module Module::Pluggable qui semble faire ce genre de choses, mais la doc est un peu succinte. Si vous avez des exemples, ou si vous savez comment faire "à la main", je suis preneur.


Message édité par matafan le 13-02-2008 à 09:15:26
Reply

Marsh Posté le 13-02-2008 à 09:13:35   

Reply

Marsh Posté le 13-02-2008 à 10:28:19    

Bon en fait j'ai trouvé comment faire "à la main". Il suffit de faire un eval "use module_name", et ensuite on peut appeler des méthodes sur des chaines de caractère (genre "ClassName"->MethodName). Je pensais avoir déja essayé ça hier mais j'avais du faire une connerie, aujourd'hui ça marche :

#
#      NAME: load_plugins
#  FUNCTION: Load and instanciate plugins from specified directory
# ARGUMENTS: - Directory where plugins are located
#    RETURN: Hash plugin name => object
#  COMMENTS: Plugin's constructor must be called "new".
#            Plugin must have a "GetName" method that return the name of the
#            plugin.
#
sub load_plugins($) {
 my ($basedir) = @_;
 my %plugin;
 
 for (<$basedir/*.pm> ) {
  s/\.pm$//;
  s/\//::/;
  eval "use $_";
  my $obj = $_->new();
  $plugin{$obj->GetName()} = $obj;
 }
 
 return %plugin;
}
 
my %cfgmethod = load_plugins("CfgMethod" );


 
Ce code charge tous les modules sous le répertoire "CfgMethod", créé une instance de chaque module, et retourne un hash ("nom du module" => objet) ("nom du module" étant le nom renvoyé par la méthode "GetName" que doit définir chaque plugin).


Message édité par matafan le 13-02-2008 à 10:37:14
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed