-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEventManager.php
More file actions
69 lines (53 loc) · 2.32 KB
/
EventManager.php
File metadata and controls
69 lines (53 loc) · 2.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<?php
declare( strict_types = 1 );
namespace TheWebSolver\Codegarage\Container\Event\Manager;
use Psr\EventDispatcher\EventDispatcherInterface;
use TheWebSolver\Codegarage\Container\Event\EventType;
use TheWebSolver\Codegarage\Container\Traits\Resetter;
use TheWebSolver\Codegarage\Container\Interfaces\Resettable;
use TheWebSolver\Codegarage\Container\Interfaces\ListenerRegistry;
class EventManager implements Resettable {
use Resetter;
/** @var array<string,(EventDispatcherInterface &ListenerRegistry)|false|null> */
private array $eventDispatchers;
/** @var array<string,bool> */
private array $assignedEventTypes;
/** @param (EventDispatcherInterface &ListenerRegistry)|false $dispatcher `false` to prevent event dispatcher from being assigned on subsequent invocation of this method. */
public function setDispatcher(
(EventDispatcherInterface&ListenerRegistry)|false $dispatcher,
EventType $eventType
): bool {
if ( $this->skipEventDispatcherFor( $eventType ) ) {
return false;
}
$this->eventDispatchers[ $eventType->name ] = $dispatcher;
$this->assignedEventTypes[ $eventType->name ] = true;
return true;
}
public function getDispatcher( EventType $eventType ): (EventDispatcherInterface&ListenerRegistry)|null {
return ( $this->eventDispatchers[ $eventType->name ] ?? null ) ?: null;
}
/** @return array<string,(EventDispatcherInterface&ListenerRegistry)|false|null> */
public function getDispatchers(): array {
return $this->eventDispatchers;
}
public function isDispatcherDisabled( EventType $eventType ): bool {
return false === ( $this->eventDispatchers[ $eventType->name ] ?? null );
}
public function isDispatcherAssigned( EventType $eventType ): bool {
return true === ( $this->assignedEventTypes[ $eventType->name ] ?? null );
}
/** @return iterable<string,Resettable|false|null> */
protected function getResettable(): iterable {
return $this->eventDispatchers;
}
protected function resetWhenCollectionIdNotProvided( Resettable $dispatcher ): void {
// Reset listeners without entries.
$dispatcher->reset( collectionId: null );
// Reset all listeners with entries.
$dispatcher->reset( collectionId: '' );
}
private function skipEventDispatcherFor( EventType $eventType ): bool {
return $this->isDispatcherDisabled( $eventType ) || $this->isDispatcherAssigned( $eventType );
}
}