from zope.interface import Interface, implements
class ISource(Interface):
def addReceiver(self, receiver):
pass
class IDataReceiver(Interface):
def dataReceived(self, a, b):
pass
class IErrorReceiver(Interface):
def errorReceived(self, err):
pass
class Source(object):
implements(ISource)
def __init__(self):
self.receivers = []
def addReceiver(self, r):
self.receivers.append(r)
def receiversFor(self, interface):
return [x for x in self.receivers if interface.providedBy(x)]
def emit(self, interface, function, *data):
for r in self.receiversFor(interface):
getattr(r, function)(*data)
class DataReceiver(object):
implements(IDataReceiver)
def dataReceived(self, a, b):
print 'data: %r %r' % (a, b)
class ErrorReceiver(object):
implements(IErrorReceiver)
def errorReceived(self, err):
print 'error: %r' % (err,)
s = Source()
s.addReceiver(DataReceiver())
s.addReceiver(DataReceiver())
s.addReceiver(ErrorReceiver())
s.emit(IDataReceiver, 'dataReceived', 'a', 'b')
s.emit(IErrorReceiver, 'errorReceived', 'something bad')