Completed
Push — master ( 424c83...4d3228 )
by Daniel
02:28
created

SimpleEmitter::unsubscribe()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 3

Importance

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