**kwargs)
def _make_recv_event(self, msg: IrcMessage) -> ClientEvent:
- # pylint: disable=unexpected-keyword-arg # confused by client_id=
- return ClientEvent.make_subtype(method_to_call='handle_msg', msg=msg)(
- client_id=self.client_id)
+ return ClientEvent.affector()(
+ client_id=self.client_id, t_method='handle_msg').kw(msg=msg)
@dataclass
def _cput(self, event_class, **kwargs) -> None:
self._put(event_class(client_id=self.client_id, **kwargs))
- def _cputs(self, method_to_call: str, **kwargs) -> None:
- self._cput(ClientEvent.make_subtype(method_to_call, **kwargs))
+ def _cputs(self, t_method: str, **kwargs) -> None:
+ self._put(ClientEvent.affector()(
+ client_id=self.client_id, t_method=t_method).kw(**kwargs))
@dataclass
'To be run by main loop on target.'
@classmethod
- def make_subtype(cls: Any, method_to_call: str, **kwargs):
- '''Return subclass whose .affect calls target.method_to_call(**kwargs).
+ def affector(cls):
+ '''Return subclass whose .affect calls target method on **kwargs.
This will often be more convenient than a full subclass definition,
which mostly only matters for what the main loop gotta differentiate.
'''
- class _AdaptedEvent(cls):
+ class _Affector:
+ def __init__(self, t_method: str, **kwargs) -> None:
+ super().__init__(**kwargs)
+ self.t_method = t_method
+ self.kwargs: dict[str, Any] = {}
+
+ def kw(self, **kwargs) -> Self:
+ 'Collect .kwargs expanded, return self for chaining.'
+ for k, v in kwargs.items():
+ self.kwargs[k] = v
+ return self
+
def affect(self, target) -> None:
- getattr(target, method_to_call)(**kwargs)
- return _AdaptedEvent
+ 'Call target.t_method(**.kwargs).'
+ getattr(target, self.t_method)(**self.kwargs)
+
+ return type('', (_Affector, cls), {})
@dataclass
to_yield += c
else:
to_yield = 'esc:' + ':'.join([str(int(b)) for b in chars])
- yield (TuiEvent.make_subtype('handle_keyboard_event',
- typed_in=to_yield)() if to_yield
+ yield (TuiEvent.affector()('handle_keyboard_event'
+ ).kw(typed_in=to_yield) if to_yield
else None)