import operator from UserDict import UserDict class Multicast(UserDict): "Class multiplexes messages to registered objects" def __init__(self, objs=[]): UserDict.__init__(self) for alias, obj in objs: self.data[alias] = obj def __call__(self, *args, **kwargs): "Invoke method attributes and return results through another Multicast" return self.__class__( [ (alias, obj(*args, **kwargs) ) for alias, obj in self.data.items() ] ) def __nonzero__(self): "A Multicast is logically true if all delegate attributes are logically true" return operator.truth(reduce(lambda a, b: a and b, self.data.values(), 1)) def __getattr__(self, name): "Wrap requested attributes for further processing" return self.__class__( [ (alias, getattr(obj, name) ) for alias, obj in self.data.items() ] ) if __name__ == "__main__": import StringIO file1 = StringIO.StringIO() file2 = StringIO.StringIO() multicast = Multicast() multicast[id(file1)] = file1 multicast[id(file2)] = file2 assert not multicast.closed multicast.write("Testing") assert file1.getvalue() == file2.getvalue() == "Testing" multicast.close() assert multicast.closed print "Test complete"