from Delegator import Delegator as DelegatorNode class NonCallable(object): def __init__(self, name): self.name = name def method(self, *args, **kw): return self.name, 'method', args, kw def action(self, *args, **kw): return self.name, 'action', args, kw class Callable(NonCallable): def __init__(self, name): NonCallable.__init__(self, name) def __call__(self, *args, **kw): return self.name, 'callable', args, kw def function(*args, **kw): return function.name, args, kw function.name = 'function' class Filter(DelegatorNode): def __init__(self, name, next_associate): self.name = name DelegatorNode.__init__(self, next_associate) def __call__(self, *args, **kw): return self.callable_action(*args, **kw) def callable_action(self, *args, **kw): print '(in %s.callable_action: %r, %r)' % (self.name, args, kw) return self.delegate(*args, **kw) # had to use the word, finally :-) def method(self, *args, **kw): print '(in %s.method: %r %r)' % (self.name, args, kw) return self.delegate.method(*args, **kw) print "*** Proxy a non-callable instance:" instance = NonCallable('instance') filter = Filter('filter', instance) print '* call filter.method("bar"):\n', filter.method('bar') print '\n* call (through) filter.action("frob"):\n', filter.action('frob') print "\n\n*** Proxy a function:" filter = Filter('filter', function) print '* call filter("foo"):\n', filter('foo') print '\n* call filter.callable_action("foo"):\n', filter.callable_action('foo') print "\n\n*** Proxy a callable instance:" callable_instance = Callable('callable') filter = Filter('filter', callable_instance) print '* call filter("foo"):\n', filter('foo') print '\n* call filter.callable_action("foo"):\n', filter.callable_action('foo') print '\n* call filter.method("bar"):\n', filter.method('bar') print '\n* call (through) filter.action("baz"):\n', filter.action('baz')