Index: twisted/plugins/twisted_run.py
===================================================================
--- twisted/plugins/twisted_run.py	(revision 0)
+++ twisted/plugins/twisted_run.py	(revision 0)
@@ -0,0 +1,58 @@
+# Copyright (c) 2007 Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+from zope.interface import implements
+
+from twisted.plugin import IPlugin
+from twisted.python.reflect import namedAny
+from twisted.application.service import IServiceMaker
+from twisted.python.usage import Options
+
+
+class RunOptions(Options):
+    """
+    Options for runner.
+    """
+    synopsis = "package [package options]"
+
+    def parseArgs(self, runner, *opts):
+        """
+        Parse command arguments: the service, and its options.
+        """
+        self['runner'] = runner
+        self['runner_options'] = opts
+
+
+class RunPlugin(object):
+    """
+    A plugin for running other services.
+    """
+    implements(IPlugin, IServiceMaker)
+
+    name = "Twisted Run Plugin"
+    description = "A plugin to run services"
+    tapname = "run"
+
+    def options(self):
+        """
+        Return current options for runner.
+        """
+        return RunOptions()
+
+    def makeService(self, options):
+        """
+        If runner is defined, try to launch it.
+        """
+        if options['runner']:
+            runner = namedAny(options['runner'])
+            if hasattr(runner, 'options'):
+                subOptions = runner.options()
+            else:
+                # Compatibility with tap module
+                subOptions = runner.Options()
+            subOptions.parseOptions(options['runner_options'])
+            return namedAny(options['runner']).makeService(subOptions)
+
+
+run = RunPlugin()
+
