@@ -103,13 +103,14 @@ def closed(self):
103103 #} END interface
104104
105105
106- class CallbackChannelWriter ( ChannelWriter ):
106+ class CallbackWriterMixin ( object ):
107107 """The write end of a channel which allows you to setup a callback to be
108108 called after an item was written to the channel"""
109- __slots__ = ('_pre_cb' )
109+ # slots don't work with mixin's :(
110+ # __slots__ = ('_pre_cb')
110111
111- def __init__ (self , channel ):
112- super (CallbackChannelWriter , self ).__init__ (channel )
112+ def __init__ (self , * args ):
113+ super (CallbackWriterMixin , self ).__init__ (* args )
113114 self ._pre_cb = None
114115
115116 def set_pre_cb (self , fun = lambda item : item ):
@@ -126,7 +127,12 @@ def set_pre_cb(self, fun = lambda item: item):
126127 def write (self , item , block = True , timeout = None ):
127128 if self ._pre_cb :
128129 item = self ._pre_cb (item )
129- super (CallbackChannelWriter , self ).write (item , block , timeout )
130+ super (CallbackWriterMixin , self ).write (item , block , timeout )
131+
132+
133+ class CallbackChannelWriter (CallbackWriterMixin , ChannelWriter ):
134+ """Implements a channel writer with callback functionality"""
135+ pass
130136
131137
132138class Reader (object ):
@@ -238,12 +244,14 @@ def read(self, count=0, block=True, timeout=None):
238244
239245 #} END interface
240246
241- class CallbackChannelReader (ChannelReader ):
247+
248+ class CallbackReaderMixin (object ):
242249 """A channel which sends a callback before items are read from the channel"""
243- __slots__ = "_pre_cb"
250+ # unfortunately, slots can only use direct inheritance, have to turn it off :(
251+ # __slots__ = "_pre_cb"
244252
245- def __init__ (self , channel ):
246- super (CallbackChannelReader , self ).__init__ (channel )
253+ def __init__ (self , * args ):
254+ super (CallbackReaderMixin , self ).__init__ (* args )
247255 self ._pre_cb = None
248256
249257 def set_pre_cb (self , fun = lambda count : None ):
@@ -260,7 +268,12 @@ def set_pre_cb(self, fun = lambda count: None):
260268 def read (self , count = 0 , block = True , timeout = None ):
261269 if self ._pre_cb :
262270 self ._pre_cb (count )
263- return super (CallbackChannelReader , self ).read (count , block , timeout )
271+ return super (CallbackReaderMixin , self ).read (count , block , timeout )
272+
273+
274+ class CallbackChannelReader (CallbackReaderMixin , ChannelReader ):
275+ """Implements a channel reader with callback functionality"""
276+ pass
264277
265278
266279class IteratorReader (Reader ):
0 commit comments