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