Completed
Push — master ( b8e1f5...403d19 )
by Daniel
02:37
created

BasicEventBus::emit()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 9
ccs 8
cts 8
cp 1
rs 9.6666
c 0
b 0
f 0
cc 2
eloc 6
nc 2
nop 1
crap 2
1
<?php
2
/**
3
 * @package narrator
4
 */
5
6
7
namespace Mleko\Narrator;
8
9
10
class BasicEventBus implements EventBus
11
{
12
13
    /** @var array */
14
    private $listeners = [];
15
16
    /** @var EventNameExtractor */
17
    private $eventNameExtractor;
18
19
    /**
20
     * SimpleEventBus constructor.
21
     * @param EventNameExtractor $eventNameExtractor
22
     * @param Listener[][] $listeners
23
     */
24 9
    public function __construct(EventNameExtractor $eventNameExtractor, array $listeners = [])
25
    {
26 9
        $this->eventNameExtractor = $eventNameExtractor;
27 9
        foreach ($listeners as $eventName => $eventListeners) {
28 1
            foreach ($eventListeners as $listener) {
29 1
                $this->subscribe($eventName, $listener);
30 1
            }
31 9
        }
32 9
    }
33
34
    /**
35
     * @param object $event
36
     * @return void
37
     */
38 8
    public function emit($event)
39
    {
40 8
        $eventName = $this->extractEventName($event);
41 8
        $eventListeners = $this->getEventListeners($eventName);
42 8
        $eventMeta = new Meta($event, $eventName, $eventName, $this);
43 8
        foreach ($eventListeners as $listener) {
44 8
            $listener->handle($event, $eventMeta);
45 8
        }
46 8
    }
47
48
    /**
49
     * @param string $eventName
50
     * @param Listener $listener
51
     * @return Subscription
52
     */
53 9
    public function subscribe($eventName, Listener $listener)
54
    {
55 9
        $this->listeners[$eventName][] = $listener;
56 9
        return new Subscription($eventName, $listener, $this);
57
    }
58
59
    /**
60
     * @param string $eventName
61
     * @param Listener $listener
62
     * @return bool
63
     */
64 6
    public function unsubscribe($eventName, Listener $listener)
65
    {
66 6
        $eventListeners = $this->getEventListeners($eventName);
67 6
        foreach ($eventListeners as $key => $eventListener) {
68 6
            if ($listener === $eventListener) {
69 6
                unset($this->listeners[$eventName][$key]);
70 6
                return true;
71
            }
72 3
        }
73 3
        return false;
74
    }
75
76
    /**
77
     * @param $event
78
     * @return string
79
     */
80 8
    private function extractEventName($event)
81
    {
82 8
        return $this->eventNameExtractor->extract($event);
83
    }
84
85
    /**
86
     * @param string $eventName
87
     * @return Listener[]
88
     */
89 9
    private function getEventListeners($eventName)
90
    {
91 9
        $eventListeners = array_key_exists($eventName, $this->listeners) ? $this->listeners[$eventName] : [];
92 9
        return $eventListeners;
93
    }
94
}
95