package plugin; use Exporter; @ISA = qw( Exporter ); @EXPORT = qw( &new &PluginGetFunctions &PluginUseFunction ); $VERSION = 0.1; use strict; sub new { my $class = shift; my $self = {}; bless( $self, $class ); $self->add( @_ ) if ( @_ ); return $self; } sub PluginGetFunctions{ my $self = shift; my $plugins = $_[0]; my @links; for ( keys %$plugins ){ my $obj = $plugins->{ $_ }; push @links, '?action=' . $_ . ';plugin=' . $obj->{'class'} for $obj->{'functions'}; } return @links; } sub PluginUseFunction{ my $self = shift; my $packagename = $_[0]; my $function = $_[1]; my $obj = eval $packagename . '->new'; return eval $obj . '->' . $function; } sub PluginGetFromDir{ my $self = shift; my $directory = $_[0]; my $tiefe = $_[1]; die 'Not enough arguments to get Plugin.' if ! $directory; my ( %plugins ); opendir( PLUGINS, $directory ) || die 'Can&´t open Plugindirectory: ' . $directory . ' -> ' .$!; for ( readdir( PLUGINS ) ){ next if $_ =~ m|^\.+|; my $fullpath = $directory . '/' . $_; if ( -d $fullpath && $tiefe >= 1 ){ my $resttiefe = $tiefe-1; my ( $pname, $pobj ) = PluginGetFromDir( '', $fullpath, $resttiefe ); $plugins{ $pname } = $pobj if ( $pname && $pobj ); } next if $_ !~ m|\.pl$|i; my ( $pname, $pobj ) = PluginValidate( $fullpath, $_ ); $plugins{ $pname } = $pobj if ( $pname && $pobj ); } closedir PLUGINS; return ( %plugins ); } sub PluginValidate{ my $fullpath = $_[0]; my $filename = $_[1]; my $packagename = $filename; $packagename =~ s|(.*?)\.pl$|$1|i; require $fullpath; my $obj = eval $packagename.'->new()'; return undef if ! $obj->{'name'}; return undef if ! $obj->{'version'}; return undef if ! $obj->{'functions'}; return ( $packagename, $obj ); } 1;