Completed
Push — master ( d37ad3...5c38af )
by Markus
15s queued 11s
created

EventListenerProvider::getListener()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 1
Metric Value
eloc 3
c 1
b 1
f 1
dl 0
loc 7
rs 10
cc 2
nc 2
nop 3
1
<?php
2
3
declare(strict_types = 1);
4
5
namespace Jellyfish\Event;
6
7
use Jellyfish\Event\Exception\NotSupportedTypeException;
8
9
class EventListenerProvider implements EventListenerProviderInterface
10
{
11
    /**
12
     * @var array
13
     */
14
    protected $listeners = [
15
        EventListenerInterface::TYPE_SYNC => [],
16
        EventListenerInterface::TYPE_ASYNC => []
17
    ];
18
19
    /**
20
     * @param string $eventName
21
     * @param \Jellyfish\Event\EventListenerInterface $listener
22
     *
23
     * @return \Jellyfish\Event\EventListenerProviderInterface
24
     */
25
    public function addListener(string $eventName, EventListenerInterface $listener): EventListenerProviderInterface
26
    {
27
        $type = $listener->getType();
28
29
        if (!\array_key_exists($eventName, $this->listeners[$type])) {
30
            $this->listeners[$type][$eventName] = [];
31
        }
32
33
        $this->listeners[$type][$eventName][$listener->getIdentifier()] = $listener;
34
35
        return $this;
36
    }
37
38
    /**
39
     * @param string $eventName
40
     * @param \Jellyfish\Event\EventListenerInterface $listener
41
     *
42
     * @return \Jellyfish\Event\EventListenerProviderInterface
43
     */
44
    public function removeListener(string $eventName, EventListenerInterface $listener): EventListenerProviderInterface
45
    {
46
        $type = $listener->getType();
47
        $listenerIdentifier = $listener->getIdentifier();
48
49
        if (!$this->hasListener($type, $eventName, $listenerIdentifier)) {
50
            return $this;
51
        }
52
53
        unset($this->listeners[$type][$eventName][$listenerIdentifier]);
54
55
        return $this;
56
    }
57
58
    /**
59
     * @param string $type
60
     * @param string $eventName
61
     * @param string $listenerIdentifier
62
     *
63
     * @return \Jellyfish\Event\EventListenerInterface|null
64
     */
65
    public function getListener(string $type, string $eventName, string $listenerIdentifier): ?EventListenerInterface
66
    {
67
        if (!$this->hasListener($type, $eventName, $listenerIdentifier)) {
68
            return null;
69
        }
70
71
        return $this->listeners[$type][$eventName][$listenerIdentifier];
72
    }
73
74
    /**
75
     * @param string $type
76
     * @param string $eventName
77
     * @param string $listenerIdentifier
78
     *
79
     * @return bool
80
     */
81
    public function hasListener(string $type, string $eventName, string $listenerIdentifier): bool
82
    {
83
        return \array_key_exists($eventName, $this->listeners[$type])
84
            && \array_key_exists($listenerIdentifier, $this->listeners[$type][$eventName]);
85
    }
86
87
    /**
88
     * @return array
89
     */
90
    public function getAllListeners(): array
91
    {
92
        return $this->listeners;
93
    }
94
95
    /**
96
     * @param string $type
97
     *
98
     * @return array
99
     *
100
     * @throws \Jellyfish\Event\Exception\NotSupportedTypeException
101
     */
102
    public function getListenersByType(string $type): array
103
    {
104
        if (!\array_key_exists($type, $this->listeners)) {
105
            throw new NotSupportedTypeException(\sprintf('Given type "%s" is not supported', $type));
106
        }
107
108
        return $this->listeners[$type];
109
    }
110
111
    /**
112
     * @param string $type
113
     * @param string $eventName
114
     *
115
     * @return array
116
     *
117
     * @throws \Jellyfish\Event\Exception\NotSupportedTypeException
118
     */
119
    public function getListenersByTypeAndEventName(string $type, string $eventName): array
120
    {
121
        $listeners = $this->getListenersByType($type);
122
123
        if (\array_key_exists($eventName, $listeners)) {
124
            return $listeners[$eventName];
125
        }
126
127
        return [];
128
    }
129
}
130