domain_event.py 669 B

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