Completed
Push — master ( 4d2a3e...f3605b )
by Daniel
02:16
created

SimpleEmitter   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 92
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 84.21%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 14
c 1
b 0
f 0
lcom 1
cbo 4
dl 0
loc 92
ccs 32
cts 38
cp 0.8421
rs 10

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 13 4
A emit() 0 9 2
A addListener() 0 8 2
A removeListener() 0 11 3
A extractEventName() 0 4 1
A getEventListeners() 0 5 2
1
<?php
2
/**
3
 * @package event
4
 */
5
6
7
namespace Mleko\Event;
8
9
10
class SimpleEmitter implements MutableEmitter
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[]|Listener[][] $listeners
23
     */
24 7
    public function __construct(EventNameExtractor $eventNameExtractor, array $listeners = [])
25
    {
26 7
        $this->eventNameExtractor = $eventNameExtractor;
27 7
        foreach ($listeners as $eventName => $listenerDef) {
28
            if (is_array($listenerDef)) {
29
                foreach ($listenerDef as $listener) {
30
                    $this->addListener($eventName, $listener);
31
                }
32
            } else {
33
                $this->addListener($eventName, $listenerDef);
34
            }
35 7
        }
36 7
    }
37
38
    /**
39
     * @param object $event
40
     * @return void
41
     */
42 7
    public function emit($event)
43
    {
44 7
        $eventName = $this->extractEventName($event);
45 7
        $eventListeners = $this->getEventListeners($eventName);
46 7
        $eventMeta = new Meta($event, $eventName, $eventName, $this);
47 7
        foreach ($eventListeners as $listener) {
48 7
            $listener->handle($event, $eventMeta);
49 7
        }
50 7
    }
51
52
    /**
53
     * @param string $eventName
54
     * @param Listener $listener
55
     * @return Subscription
56
     */
57 7
    public function addListener($eventName, Listener $listener)
58
    {
59 7
        if (!isset($this->listeners[$eventName])) {
60 7
            $this->listeners[$eventName] = [];
61 7
        }
62 7
        $this->listeners[$eventName][] = $listener;
63 7
        return new Subscription($eventName, $listener, $this);
64
    }
65
66
    /**
67
     * @param string $eventName
68
     * @param Listener $listener
69
     * @return bool
70
     */
71 3
    public function removeListener($eventName, Listener $listener)
72
    {
73 3
        $eventListeners = $this->getEventListeners($eventName);
74 3
        foreach ($eventListeners as $key => $eventListener) {
75 3
            if ($listener === $eventListener) {
76 3
                unset($this->listeners[$eventName][$key]);
77 3
                return true;
78
            }
79 2
        }
80 2
        return false;
81
    }
82
83
    /**
84
     * @param $event
85
     * @return string
86
     */
87 7
    private function extractEventName($event)
88
    {
89 7
        return $this->eventNameExtractor->extract($event);
90
    }
91
92
    /**
93
     * @param string $eventName
94
     * @return Listener[]
95
     */
96 7
    private function getEventListeners($eventName)
97
    {
98 7
        $eventListeners = array_key_exists($eventName, $this->listeners) ? $this->listeners[$eventName] : [];
99 7
        return $eventListeners;
100
    }
101
}
102