domain_event.py 645 B

123456789101112131415161718192021222324252627
  1. # (c) Nelen & Schuurmans
  2. from abc import ABC
  3. from typing import Awaitable
  4. from typing import Callable
  5. from typing import TypeVar
  6. import blinker
  7. __all__ = ["DomainEvent"]
  8. TDomainEvent = TypeVar("TDomainEvent", bound="DomainEvent")
  9. TEventHandler = Callable[[TDomainEvent], Awaitable[None]]
  10. class DomainEvent(ABC):
  11. @classmethod
  12. def _signal(cls) -> blinker.Signal:
  13. return blinker.signal(cls.__name__)
  14. @classmethod
  15. def register_handler(cls, receiver: TEventHandler) -> TEventHandler:
  16. return cls._signal().connect(receiver)
  17. async def send_async(self) -> None:
  18. await self._signal().send_async(self)