Completed
Push — master ( 19f052...a53983 )
by Daniel
03:36 queued 01:26
created

SimpleEmitter   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 82
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 11
c 1
b 0
f 0
lcom 1
cbo 4
dl 0
loc 82
ccs 27
cts 27
cp 1
rs 10

6 Methods

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