Emitter::emit()   A
last analyzed

Complexity

Conditions 3
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 3

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 5
c 1
b 0
f 1
dl 0
loc 10
ccs 7
cts 7
cp 1
rs 10
cc 3
nc 2
nop 2
crap 3
1
<?php
2
namespace Fyuze\Event;
3
4
use Psr\Log\LoggerInterface;
5
use InvalidArgumentException;
6
7
class Emitter
8
{
9
    /**
10
     * @var array
11
     */
12
    protected $events = [];
13
14
    /**
15
     * @var LoggerInterface|null
16
     */
17
    protected $logger;
18
19
    /**
20
     * @param $name
21
     * @param \Closure $closure
22
     */
23 6
    public function listen($name, \Closure $closure)
24
    {
25 6
        $this->events[$name][] = $closure;
26
    }
27
28
    /**
29
     * @param $name
30
     * @return bool
31
     */
32 1
    public function drop($name)
33
    {
34 1
        if (!$this->has($name)) {
35 1
            return false;
36
        }
37
38 1
        unset($this->events[$name]);
39
40 1
        return true;
41
    }
42
43
    /**
44
     * @param $name
45
     * @return bool
46
     */
47 7
    public function has($name)
48
    {
49 7
        return array_key_exists($name, $this->events);
50
    }
51
52
    /**
53
     * @param $name
54
     * @param array $params
55
     * @return void
56
     * @throws InvalidArgumentException
57
     */
58 5
    public function emit($name, $params = null)
59
    {
60 5
        foreach ($this->locate($name) as $event) {
61
62 4
            call_user_func_array(
63 4
                $event,
64 4
                is_array($params) ? $params : [$params]
65 4
            );
66
67 4
            $this->log(sprintf('Event: %s fired: %s', $name, json_encode($event)));
68
        }
69
    }
70
71
    /**
72
     * @param LoggerInterface $logger
73
     * @return $this
74
     */
75 4
    public function setLogger(LoggerInterface $logger)
76
    {
77 4
        $this->logger = $logger;
78
79 4
        return $this;
80
    }
81
82
    /**
83
     * @param $name
84
     * @return array
85
     */
86 5
    protected function locate($name)
87
    {
88 5
        if (!$this->has($name)) {
89
90 1
            $this->log(sprintf('Event %s called, but no listeners were registered', $name));
91
92 1
            return [];
93
        }
94
95 4
        return $this->events[$name];
96
97
    }
98
99
    /**
100
     * @param $message
101
     * @param string $level
102
     * @return bool
103
     */
104 5
    protected function log($message, $level = 'notice')
105
    {
106 5
        if ($this->logger !== null) {
107
108 2
            $this->logger->log($level, $message);
109
110 2
            return true;
111
        }
112
113 3
        return false;
114
    }
115
}
116