home · contact · privacy
Replace AffectiveEvent.make_subtype with .affector of better inheritance handling.
authorChristian Heller <c.heller@plomlompom.de>
Tue, 5 Aug 2025 16:20:23 +0000 (18:20 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Tue, 5 Aug 2025 16:20:23 +0000 (18:20 +0200)
ircplom/client.py
ircplom/events.py
ircplom/tui_base.py

index e2d38593cd4e127f10dd6ece4b37c1e8a9324b86..bba5dfbd7ec79893a9b831859a5b220a89e485bd 100644 (file)
@@ -42,9 +42,8 @@ class _IrcConnection(BaseIrcConnection, ClientIdMixin):
                          **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
@@ -54,8 +53,9 @@ class ClientQueueMixin(QueueMixin, ClientIdMixin):
     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
index 0da75744548a7d738210e89f456b934a5ec92c3e..7c3e23651b22ee48fc5e562d9ef6aa2647b0d4ed 100644 (file)
@@ -23,16 +23,29 @@ class AffectiveEvent(Event, ABC):
         '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
index ca427a9385975290d00159143b07d2ce8e878689..dc2585f087824b82dd2ed6ef7d6e1950cffd81c3 100644 (file)
@@ -602,6 +602,6 @@ class Terminal(QueueMixin):
                             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)