<?php declare(strict_types=1);
namespace Inhere\Console\Concern;
use function count;
use function in_array;
trait SimpleEventTrait
{
protected static $supportedEvents = [];
private static $events = [];
private static $eventHandlers = [];
public function on(string $event, callable $handler, $once = false): void
{
if (self::isSupportedEvent($event)) {
self::$eventHandlers[$event][] = $handler;
if (!isset(self::$events[$event])) {
self::$events[$event] = (bool)$once;
}
}
}
public function once(string $event, callable $handler): void
{
$this->on($event, $handler, true);
}
public function fire(string $event, ...$args): bool
{
if (!isset(self::$events[$event])) {
return false;
}
$return = true;
foreach ((array)self::$eventHandlers[$event] as $cb) {
$return = $cb(...$args);
if (false === $return) {
break;
}
}
if (self::$events[$event]) {
return $this->off($event);
}
return (bool)$return;
}
public function off(string $event): bool
{
if ($this->hasEvent($event)) {
unset(self::$events[$event], self::$eventHandlers[$event]);
return true;
}
return false;
}
public function hasEvent(string $event): bool
{
return isset(self::$events[$event]);
}
public function isOnce(string $event): bool
{
if ($this->hasEvent($event)) {
return self::$events[$event];
}
return false;
}
public static function isSupportedEvent(string $event): bool
{
if (!$event || !preg_match('/[a-zA-z][\w-]+/', $event)) {
return false;
}
if ($ets = self::$supportedEvents) {
return in_array($event, $ets, true);
}
return true;
}
public static function getSupportEvents(): array
{
return self::$supportedEvents;
}
public static function setSupportEvents(array $supportedEvents): void
{
self::$supportedEvents = $supportedEvents;
}
public static function getEvents(): array
{
return self::$events;
}
public static function countEvents(): int
{
return count(self::$events);
}
}