import sys class PluginManager(object): def __init__(self): self.plugins = [] def register(self, plugin): self.plugins.append(plugin) def __getattr__(self, name): def caller(data, *args, **kwargs): return_value = data processed = False for plugin in self.plugins: try: method = getattr(plugin, name) return_value = method(return_value, *args, **kwargs) processed = True except KeyError: pass except Exception: sys.excepthook(*sys.exc_info()) if not processed: print "Warning: no plugin implemented '%s'" % name return return_value return caller plugin_manager = PluginManager()