sub GetPluginList{ # array fuer die hashreferenzen auf die plugindaten my ( @plugins ) = GetPluginFromDir( 'plugins', '1' ); my $i; for my $plugin ( @plugins ){ $i++; print "\n Name: ".$plugin->{pluginname}; print "\n Version: ".$plugin->{version}; my $ref = $plugin->{'funktionen'}; for( keys %$ref ) { print "\n Funktion: ".$_; print "\n -->Rueckgabe: "; print eval "$plugin->{package}::$_"; } } } sub GetPluginFromDir{    # uebergeben wird der directory-path    my $directory = $_[0];    # die on error    die 'Not enough arguments to get Plugin.' if ! $directory;    # ist diese var gesetzt, werden auch unterverzeichnisse    # bis zu dieser Tiefe mit verarbeitet    my $tiefe = $_[1];    # enthaelt und uebergibt den gefunden plugin    my ( @plugins );    # die plugindirectory darf fuer jeden plugin    # ein eigenes verzeichnis mit allen templates    # etc. enthalten.    opendir( PLUGINS, $directory ) ||         die 'Can´t open Plugindirectory: ' . $directory;    for ( readdir( PLUGINS ) ){       # es werden nur verzeichnisse und .pl files gelesen.:       # weiter wenns uebergeordnete verzeichnisse sind       next if $_ =~ m|^\.+|;       my $fullpath = $directory . '/' . $_;       # diese routine rekursiv aufrufen, wenns ein verzeichnis       # ist und die tiefe mindestens 1 betraegt       if ( -d $fullpath && $tiefe >= 1 ){           # resttiefe fuer den naechsten aufruf um 1 tiefer setzen           my $resttiefe = $tiefe-1;           push( @plugins, GetPluginFromDir( $fullpath, $resttiefe ) );       }       # weiter wenns kein plugin ist       next if $_ !~ m|\.pl$|i;       # plugin validieren oder bei fehler einfach ueberspringen       my $pluginhashref = ValidatePlugin( $fullpath ) || next;       push( @plugins, $pluginhashref );    }    closedir PLUGINS;    return ( @plugins ); } # pruefen der gueltigkeit des plugins sub ValidatePlugin{    my $fullpath = $_[0];    my %pluginfo;    # plugin laden, rueckgabewert des moduls ist der namensraum    require $fullpath;    %pluginfo = &PlugIn::init;    # abbrechen und NULL zurückgeben, wenn nicht    # die mindestinfos zurueckgeliefert wurden    return undef if ! $pluginfo{'pluginname'};    return undef if ! $pluginfo{'version'   };    return undef if ! $pluginfo{'package'   };    return undef if ! $pluginfo{'package'   };    return \%pluginfo; }