EventEmitterTrait::addListener()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 5
cts 5
cp 1
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 2
crap 2
1
<?php
2
/**
3
 * @author Alexey Samoylov <[email protected]>
4
 */
5
6
namespace YarCode\Events;
7
8
trait EventEmitterTrait
9
{
10
    private $listeners = [];
11
12
    /**
13
     * @param string $eventName
14
     * @param callable $listener
15
     */
16 10
    public function addListener($eventName, callable $listener)
17
    {
18 10
        if (!isset($this->listeners[$eventName])) {
19 10
            $this->listeners[$eventName] = [];
20
        }
21
22 10
        $this->listeners[$eventName][] = $listener;
23 10
    }
24
25
    /**
26
     * @param string $eventName
27
     * @param callable $listener
28
     */
29 1
    public function removeListener($eventName, callable $listener)
30
    {
31 1
        if (isset($this->listeners[$eventName])) {
32 1
            if (false !== $index = array_search($listener, $this->listeners[$eventName], true)) {
33 1
                unset($this->listeners[$eventName][$index]);
34
            }
35
        }
36 1
    }
37
38
    /**
39
     * @param string|null $eventName
40
     */
41 2
    public function removeAllListeners($eventName = null)
42
    {
43 2
        if ($eventName !== null) {
44 1
            unset($this->listeners[$eventName]);
45
        } else {
46 1
            $this->listeners = [];
47
        }
48 2
    }
49
50
    /**
51
     * @param string $eventName
52
     * @param Event|mixed $eventData
53
     */
54 5
    public function emit($eventName, $eventData = null)
55
    {
56 5
        if (empty($this->listeners($eventName))) {
57 1
            return;
58
        }
59
60 4
        if ($eventData === null) {
61 2
            $eventData = new Event();
62 2
            $eventData->name = $eventName;
63 2
            $eventData->handled = false;
64
        }
65
66 4
        $this->runListeners($eventName, $eventData);
67 4
    }
68
69
    /**
70
     * @param string $eventName
71
     * @return array
72
     */
73 10
    public function listeners($eventName)
74
    {
75 10
        return isset($this->listeners[$eventName]) ? $this->listeners[$eventName] : [];
76
    }
77
78
    /**
79
     * @param string $eventName
80
     * @param Event|mixed $eventData
81
     */
82 4
    private function runListeners($eventName, $eventData)
83
    {
84 4
        foreach ($this->listeners($eventName) as $listener) {
85 4
            call_user_func($listener, $eventData, $this);
86 4
            if ($eventData instanceof Event) {
87 2
                if ($eventData->handled) {
88 1
                    break;
89
                }
90
            }
91
        }
92 4
    }
93
}
94