class MulticastDelegate(object): def __init__(self): self.delegates = [] def __iadd__(self, delegate): self.add(delegate) return self def add(self, delegate): self.delegates.append(delegate) def __isub__(self, delegate): self.delegates.remove(delegate) return self def __call__(self, *args, **kwargs): for d in self.delegates: d(*args, **kwargs)