Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1459 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  Chargement dynamique de modules

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Chargement dynamique de modules

n°1685644
matafan
Posté le 13-02-2008 à 09:13:35  profilanswer
 

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
mood
Publicité
Posté le 13-02-2008 à 09:13:35  profilanswer
 

n°1685695
matafan
Posté le 13-02-2008 à 10:28:19  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  Chargement dynamique de modules

 

Sujets relatifs
Eviter les flashs blancs au chargement des pagesproblème allocation tableau dynamique
Intégration police spéciale dans texte dynamiqueProbleme chargement de page et Javascript sous Firefox
[ASP.NET] des modules (scripts) ASP.NET gratuits (comme PHP) ?Problème de chargement de donnée dans une liste
Connaître les modules et la version des modules installés sur mon pcmenu fixe + reste dynamique en CSS
[MFC] Scroll bar dynamique[resolu]image dynamique en php
Plus de sujets relatifs à : Chargement dynamique de modules


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)