Merge branch 'master' of git.freeside.biz:/home/git/freeside
[freeside.git] / rt / lib / RT / Shredder / Plugin.pm
index b7c63ec..2c7a790 100644 (file)
@@ -2,7 +2,7 @@
 #
 # COPYRIGHT:
 #
-# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2015 Best Practical Solutions, LLC
 #                                          <sales@bestpractical.com>
 #
 # (Except where explicitly superseded by other copyright notices)
@@ -64,7 +64,7 @@ RT::Shredder::Plugin - interface to access shredder plugins
   my %plugins = RT::Shredder::Plugin->List;
 
   # load plugin by name
-  my $plugin = new RT::Shredder::Plugin;
+  my $plugin = RT::Shredder::Plugin->new;
   my( $status, $msg ) = $plugin->LoadByName( 'Tickets' );
   unless( $status ) {
       print STDERR "Couldn't load plugin 'Tickets': $msg\n";
@@ -72,7 +72,7 @@ RT::Shredder::Plugin - interface to access shredder plugins
   }
 
   # load plugin by preformatted string
-  my $plugin = new RT::Shredder::Plugin;
+  my $plugin = RT::Shredder::Plugin->new;
   my( $status, $msg ) = $plugin->LoadByString( 'Tickets=status,deleted' );
   unless( $status ) {
       print STDERR "Couldn't load plugin: $msg\n";
@@ -103,6 +103,7 @@ sub _Init
     my $self = shift;
     my %args = ( @_ );
     $self->{'opt'} = \%args;
+    return;
 }
 
 =head2 List
@@ -129,7 +130,7 @@ sub List
 
     my %res;
     for my $f (reverse @files) {
-        $res{$1} = $_ if $f =~ /([^\\\/]+)\.pm$/;
+        $res{$1} = $f if $f =~ /([^\\\/]+)\.pm$/;
     }
 
     return %res unless $type;
@@ -137,7 +138,7 @@ sub List
     delete $res{'Base'};
     foreach my $name( keys %res ) {
         my $class = join '::', qw(RT Shredder Plugin), $name;
-        unless( eval "require $class" ) {
+        unless( $class->require ) {
             delete $res{ $name };
             next;
         }
@@ -161,24 +162,26 @@ Other arguments are sent to the constructor of the plugin
 Returns C<$status> and C<$message>. On errors status
 is C<false> value.
 
+In scalar context, returns $status only.
+
 =cut
 
 sub LoadByName
 {
     my $self = shift;
     my $name = shift or return (0, "Name not specified");
+    $name =~ /^\w+(::\w+)*$/ or return (0, "Invalid plugin name");
 
-    local $@;
     my $plugin = "RT::Shredder::Plugin::$name";
-    eval "require $plugin" or return( 0, $@ );
-    return( 0, "Plugin '$plugin' has no method new") unless $plugin->can('new');
+    $plugin->require or return( 0, "Failed to load $plugin" );
+    return wantarray ? ( 0, "Plugin '$plugin' has no method new") : 0 unless $plugin->can('new');
 
     my $obj = eval { $plugin->new( @_ ) };
-    return( 0, $@ ) if $@;
-    return( 0, 'constructor returned empty object' ) unless $obj;
+    return wantarray ? ( 0, $@ ) : 0 if $@;
+    return wantarray ? ( 0, 'constructor returned empty object' ) : 0 unless $obj;
 
     $self->Rebless( $obj );
-    return( 1, "successfuly load plugin" );
+    return wantarray ? ( 1, "successfuly load plugin" ) : 1;
 }
 
 =head2 LoadByString