Passed
Push — feat/add-rector ( 29ca5e )
by Chema
04:27
created

ConfigurableEventDispatcher::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 0

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1

Importance

Changes 0
Metric Value
eloc 0
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 2
cc 1
rs 10
ccs 1
cts 1
cp 1
crap 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Gacela\Framework\Event\Dispatcher;
6
7
use function get_class;
8
9
final class ConfigurableEventDispatcher implements EventDispatcherInterface
10
{
11
    /** @var array<callable> */
12
    private array $genericListeners = [];
13
14
    /** @var array<class-string,list<callable>> */
0 ignored issues
show
Documentation Bug introduced by
The doc comment array<class-string,list<callable>> at position 2 could not be parsed: Unknown type name 'class-string' at position 2 in array<class-string,list<callable>>.
Loading history...
15
    private array $specificListeners = [];
16
17
    /**
18
     * @param list<callable> $genericListeners
19
     */
20
    public function registerGenericListeners(array $genericListeners): void
21
    {
22
        $this->genericListeners = $genericListeners;
23
    }
24
25
    /**
26
     * @param class-string $event
27
     */
28
    public function registerSpecificListener(string $event, callable $listener): void
29
    {
30
        $this->specificListeners[$event][] = $listener;
31
    }
32
33
    public function dispatch(object $event): void
34
    {
35
        foreach ($this->genericListeners as $listener) {
36
            $this->notifyListener($listener, $event);
37
        }
38
39
        foreach ($this->specificListeners[get_class($event)] ?? [] as $listener) {
40
            $this->notifyListener($listener, $event);
41
        }
42
    }
43
44
    private function notifyListener(callable $listener, object $event): void
45
    {
46
        $listener($event);
47
    }
48
}
49