**kwargs)
def _make_recv_event(self, msg: IrcMessage) -> ClientEvent:
- return ClientEvent.affector()(
- client_id=self.client_id, t_method='handle_msg').kw(msg=msg)
+ return ClientEvent.affector('handle_msg', client_id=self.client_id
+ ).kw(msg=msg)
@dataclass
'To QueueMixin adds _cput to send ClientEvent for self.'
def _cput(self, t_method: str, **kwargs) -> None:
- self._put(ClientEvent.affector()(
- client_id=self.client_id, t_method=t_method).kw(**kwargs))
+ self._put(ClientEvent.affector(t_method, client_id=self.client_id
+ ).kw(**kwargs))
@dataclass
class _ClientKnowingTui(Client):
def _ctput(self, t_method: str, **kwargs) -> None:
- self._put(TuiEvent.affector()(t_method).kw(client_id=self.client_id
- ).kw(**kwargs))
+ self._put(TuiEvent.affector(t_method).kw(client_id=self.client_id
+ ).kw(**kwargs))
def _log(self, msg: str, stream: str = STREAM_SERVER) -> None:
self._ctput('log_for_client', stream=stream, msg=msg)
'To be run by main loop on target.'
@classmethod
- def affector(cls):
- '''Return subclass whose .affect calls target method on **kwargs.
+ def affector(cls, t_method: str, **kwargs):
+ '''Return instance of subclass affecting target via t_method.
This will often be more convenient than a full subclass definition,
which mostly only matters for what the main loop gotta differentiate.
'''
- 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:
- 'Call target.t_method(**.kwargs).'
- getattr(target, self.t_method)(**self.kwargs)
-
- return type(f'{cls.__name__}·Affector', (_Affector, cls), {})
+ def wrap(): # else current mypy throw [valid-type] on 'Variable "cls"'
+ class _Affector(cls):
+ 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:
+ 'Call target.t_method(**.kwargs).'
+ getattr(target, self.t_method)(**self.kwargs)
+
+ return _Affector
+
+ return wrap()(t_method=t_method, **kwargs)
@dataclass