Bug 16963 - Remove the use of "onclick" from subscription add template
[srvgit] / Koha / Plugins.pm
index 797f600..c0598b1 100644 (file)
@@ -4,31 +4,31 @@ package Koha::Plugins;
 #
 # This file is part of Koha.
 #
-# Koha is free software; you can redistribute it and/or modify it under the
-# terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at your option) any later
-# version.
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
 #
-# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
 #
-# You should have received a copy of the GNU General Public License along
-# with Koha; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
 
 use Modern::Perl;
 
 use Module::Load::Conditional qw(can_load);
-use Module::Pluggable search_path => ['Koha::Plugin'];
+use Module::Pluggable search_path => ['Koha::Plugin'], except => qr/::Edifact(|::Line|::Message|::Order|::Segment|::Transport)$/;
+use List::MoreUtils qw( any );
 
 use C4::Context;
 use C4::Output;
 
 BEGIN {
-    die('Plugins not enabled in config') unless ( C4::Context->config("enable_plugins") );
-
     push @INC, C4::Context->config("pluginsdir");
+    pop @INC if $INC[-1] eq '.';
 }
 
 =head1 NAME
@@ -40,38 +40,50 @@ Koha::Plugins - Module for loading and managing plugins.
 sub new {
     my ( $class, $args ) = @_;
 
+    return unless ( C4::Context->config("enable_plugins") || $args->{'enable_plugins'} );
+
     $args->{'pluginsdir'} = C4::Context->config("pluginsdir");
 
     return bless( $args, $class );
 }
 
-=head2 GetPlugins()
+=head2 GetPlugins
+
+This will return a list of all available plugins, optionally limited by
+method or metadata value.
 
-This will return a list of all the available plugins of the passed type.
+    my @plugins = C4::Plugins::GetPlugins({
+        method => 'some_method',
+        metadata => { some_key => 'some_value' },
+    });
 
-Usage: my @plugins = C4::Plugins::GetPlugins( $method );
+The method and metadata parameters are optional.
+Available methods currently are: 'report', 'tool', 'to_marc', 'edifact'.
+If you pass multiple keys in the metadata hash, all keys must match.
 
-At the moment, the available types are 'report' and 'tool'.
 =cut
 
 sub GetPlugins {
-    my $self   = shift;
-    my $method = shift;
+    my ( $self, $params ) = @_;
+    my $method = $params->{method};
+    my $req_metadata = $params->{metadata} // {};
 
     my @plugin_classes = $self->plugins();
     my @plugins;
 
     foreach my $plugin_class (@plugin_classes) {
         if ( can_load( modules => { $plugin_class => undef } ) ) {
-            my $plugin = $plugin_class->new();
-
-            if ($method) {
-                if ( $plugin->can($method) ) {
-                    push( @plugins, $plugin );
-                }
-            } else {
-                push( @plugins, $plugin );
-            }
+            next unless $plugin_class->isa('Koha::Plugins::Base');
+
+            my $plugin = $plugin_class->new({ enable_plugins => $self->{'enable_plugins'} });
+
+            # Limit results by method or metadata
+            next if $method && !$plugin->can($method);
+            my $plugin_metadata = $plugin->get_metadata;
+            next if $plugin_metadata
+                and %$req_metadata
+                and any { !$plugin_metadata->{$_} || $plugin_metadata->{$_} ne $req_metadata->{$_} } keys %$req_metadata;
+            push @plugins, $plugin;
         }
     }
     return @plugins;