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

ConfigurableEventDispatcher   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 38
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 9
c 2
b 0
f 0
dl 0
loc 38
rs 10
wmc 6

4 Methods

Rating   Name   Duplication   Size   Complexity  
A registerGenericListeners() 0 3 1
A notifyListener() 0 3 1
A dispatch() 0 8 3
A registerSpecificListener() 0 3 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