Factor out plugin running into the Plugin module (along with the includers() handling).
[mailshears.git] / lib / common / plugin.rb
index b0b57505873665a856dcf7ade0eafc4b82cf266a..81e1fbb6248e323f315c0108f7c9e11f5bb72b8c 100644 (file)
@@ -2,16 +2,49 @@
 # operations that all plugins are supposed to support.
 module Plugin
 
-  def Plugin.included(c)
-    # Callback, called whenever another class or module includes this
-    # one. The parameter given is the name of the class or module
-    # that included us.
-    @includers ||= []
-    @includers << c
-  end
+  module Run
+    # Module methods, meant to be extended. Includers can explicitly
+    # extend this to get a run() method defined in terms of their own
+    # runner() and dummy_runner() methods.
+
+    def included(c)
+      # Callback, called whenever another class or module includes this
+      # one. The parameter given is the name of the class or module
+      # that included us.
+      @includers ||= []
+      @includers << c
+    end
+
+    def includers
+      return @includers
+    end
+
+    def runner()
+      # The Runner associated with this plugin.
+      raise NotImplementedError
+    end
 
-  def Plugin.includers
-    return @includers
+    def dummy_runner()
+      # The RummyRunner associated with this plugin.
+      raise NotImplementedError
+    end
+
+    def run(cfg, *args)
+      includers().each do |includer|
+        plugin = includer.new(cfg)
+
+        if cfg.i_mean_business then
+          runner = runner().new()
+        else
+          runner = dummy_runner().new()
+        end
+
+        # The splat passes the correct (we hope) number of arguments to the
+        # appropriate runner. The Rm(Dummy)Runner have splats on their
+        # *target arguments as well, to turn ARGV back into an array.
+        runner.run(plugin, *args)
+      end
+    end
   end
 
   def describe_domain(domain)