asdf: Plugin (Module dynamisch einbinden) - fertiger Code

Beitrag lesen

Hey,

ich würde das ganze noch etwas entkoppeln falls es dich interessiert:

  
  
sub getUserPlugin  
{  
  # sprechende variablennamen dokumentieren den code  
  my $textToParse = @_;  
  
  my $content     = eval { user_plugin($textToParse); };  
  
  # das html wird NUR hier generiert, dadurch kann  
  # man es später ändern wenn man den <b> tag leid ist  
  return '<b class="warning">'.$@.'</b>' if $@;  
  '<p class="info">'.$content.'</p>';  
}  
  
sub user_plugin  
{  
   my $textToParse       = shift or return '';  
  
   # der übersichtlichtkeit halber und eigentlich  
   # sollte man sowas irgendwo statisch definieren zwecks geschwindigkeit  
  
   my $moduleNamePattern         = /\[name:([A-Za-z]+)\]/;  
   my $parameterPattern          = /\[param:([a-z0-9_.,-]+)\]/;  
   my $parameterSeparatorPattern = /,/;  
  
   die('Plugin-Name nicht spezifiziert') unless my $plugin = ($textToParse =~ $moduleNamePattern)[0];  
  
    # warum doppel gemoppelt noch auf existenz und lesbarkeit prüfen!  
    # wenn es nicht geladen werden kann, dann kanns einfach nicht geladen werden  
    my $modulePath = $Path{cgidir} . "EHFPlugins/". $plugin .'.pm';  
    eval{ require( $modulePath ) };  
    # $self->log('could not load plugin ', $plugin, ' because ', $@);  
    die('Plugin '.$plugin.' konnte unerwartet nicht gestartet werden.') if $@;  
  
    # auch hier ::p ist ungelücklich kurz und nichtssagend gewählt  
    my $method = $plugin . '::p';  
    my @param  = split ($parameterSeparatorPattern, ($textToParse =~ $parameterPattern)[0]);  
  
    # auch beim methoden aufruf am plugin kann etwas schiefgehen!  
    my ($error, $content) = eval  
    {  
      no strict 'refs';  
      $method->(@param);  
    };  
  
    die($content) if $error || $@;  
    $content;  
}  
  

hth

ps. ich habe es nur geschrieben, nicht getestet