Passed
Push — master ( 980fc9...151cd2 )
by Alexey
01:48
created

EventEmitterTrait::emit()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 12
ccs 8
cts 8
cp 1
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 7
nc 3
nop 2
crap 3
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 7
    public function addListener($eventName, callable $listener)
17
    {
18 7
        if (!isset($this->listeners[$eventName])) {
19 7
            $this->listeners[$eventName] = [];
20
        }
21
22 7
        $this->listeners[$eventName][] = $listener;
23 7
    }
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 $event
53
     */
54 2
    public function emit($eventName, Event $event = null)
55
    {
56 2
        if (empty($this->listeners($eventName))) {
57 1
            return;
58
        }
59
60 1
        $event = $event ?: new Event();
61 1
        $event->name = $eventName;
62 1
        $event->handled = false;
63
64 1
        $this->runListeners($eventName, $event);
65 1
    }
66
67
    /**
68
     * @param string $eventName
69
     * @return array
70
     */
71 7
    public function listeners($eventName)
72
    {
73 7
        return isset($this->listeners[$eventName]) ? $this->listeners[$eventName] : [];
74
    }
75
76
    /**
77
     * @param string $eventName
78
     * @param Event $event
79
     */
80 1
    private function runListeners($eventName, Event $event)
81
    {
82 1
        foreach ($this->listeners($eventName) as $listener) {
83 1
            call_user_func($listener, $event);
84 1
            if ($event->handled) {
85 1
                break;
86
            }
87
        }
88 1
    }
89
}
90