. */ namespace SP\Core\Events; use Closure; use SP\Domain\Core\Exceptions\InvalidClassException; /** * Class Event */ readonly class Event { /** * @param object $source The emmiter of the event * @param EventMessage|Closure|null $eventMessage An {@link EventMessage} or a {@link Closure} that returns an {@link EventMessage} */ public function __construct( private object $source, private EventMessage|Closure|null $eventMessage = null ) { } /** * @template T of object * * @param class-string|null $type * @return T&object * @throws InvalidClassException */ public function getSource(?string $type = null): object { if ($type !== null && !is_a($this->source, $type)) { throw InvalidClassException::error( 'Source type mismatch', sprintf('Source: %s - Expected: %s', get_class($this->source), $type) ); } return $this->source; } public function getEventMessage(): ?EventMessage { if ($this->eventMessage instanceof Closure) { return $this->eventMessage->call($this); } return $this->eventMessage; } }