EventDispatcher   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 67
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 15
dl 0
loc 67
ccs 18
cts 18
cp 1
rs 10
c 0
b 0
f 0
wmc 8

4 Methods

Rating   Name   Duplication   Size   Complexity  
A dispatch() 0 13 4
A __construct() 0 3 1
A getListenerProvider() 0 3 1
A withListenerProvider() 0 10 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Jasny\EventDispatcher;
6
7
use Psr\EventDispatcher\EventDispatcherInterface;
8
use Psr\EventDispatcher\ListenerProviderInterface;
9
use Psr\EventDispatcher\StoppableEventInterface;
10
11
/**
12
 * Event dispatcher.
13
 * @immutable
14
 */
15
class EventDispatcher implements EventDispatcherInterface
16
{
17
    /**
18
     * @var ListenerProviderInterface
19
     */
20
    protected $listenerProvider;
21
22
23
    /**
24
     * EventDispatcher constructor.
25
     *
26
     * @param ListenerProviderInterface $listenerProvider
27
     */
28 3
    public function __construct(ListenerProviderInterface $listenerProvider)
29
    {
30 3
        $this->listenerProvider = $listenerProvider;
31 3
    }
32
33
34
    /**
35
     * Get the listener provider used by this dispatcher
36
     *
37
     * @return ListenerProviderInterface
38
     */
39 1
    public function getListenerProvider(): ListenerProviderInterface
40
    {
41 1
        return $this->listenerProvider;
42
    }
43
44
    /**
45
     * Get a dispatcher with a different/modified listener provider.
46
     *
47
     * @param ListenerProviderInterface $listenerProvider
48
     * @return static
49
     */
50 1
    public function withListenerProvider(ListenerProviderInterface $listenerProvider): self
51
    {
52 1
        if ($this->listenerProvider === $listenerProvider) {
53 1
            return $this;
54
        }
55
56 1
        $clone = clone $this;
57 1
        $clone->listenerProvider = $listenerProvider;
58
59 1
        return $clone;
60
    }
61
62
63
    /**
64
     * Dispatch an event.
65
     *
66
     * @param object $event
67
     * @return object  The event that was passed, now modified by the listeners.
68
     */
69 2
    public function dispatch(object $event): object
70
    {
71 2
        $listeners = $this->listenerProvider->getListenersForEvent($event);
72
73 2
        foreach ($listeners as $listener) {
74 2
            if ($event instanceof StoppableEventInterface && $event->isPropagationStopped()) {
75 1
                break;
76
            }
77
78 2
            $listener($event);
79
        }
80
81 2
        return $event;
82
    }
83
}
84