################## ## def __call__(self, *args, **kw): ## return self.delegate(*args, **kw) class Hooker(Delegator): def __init__(self, name): Delegator.__init__(self) self.name = name def my_fcn(self, caller): print "Hooker %s called via %s" % (self.name, caller) def __call__(self, *args, **kw): self.my_fcn(*args) self.delegate(*args, **kw) class Interceptor(Delegator): def __init__(self, name): Delegator.__init__(self) self.name = name def my_fcn(self, caller): print "Interceptor %s called via %s" % (self.name, caller) def __call__(self, *args, **kw): self.my_fcn(*args) #self.delegate(*args, **kw) # uncomment to propagate def fcn(caller): print "Fcn at base called via %s" % caller if __name__ == "__main__": bottom = Hooker("bottom") bottom.setdelegate(fcn) middle = Hooker("middle") middle.setdelegate(bottom) top = Interceptor("top") top.setdelegate(middle) print "top: ", top print "top.delegate: ", top.delegate print "calling top()... " top("top()")