Subversion Repositories php-qbpwcf

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3 liveuser 1
<?php declare(strict_types=1);
2
 
3
/*
4
 * This file is part of Evenement.
5
 *
6
 * (c) Igor Wiedler <igor@wiedler.ch>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
 
12
namespace Evenement;
13
 
14
use InvalidArgumentException;
15
 
16
trait EventEmitterTrait
17
{
18
    protected $listeners = [];
19
    protected $onceListeners = [];
20
 
21
    public function on($event, callable $listener)
22
    {
23
        if ($event === null) {
24
            throw new InvalidArgumentException('event name must not be null');
25
        }
26
 
27
        if (!isset($this->listeners[$event])) {
28
            $this->listeners[$event] = [];
29
        }
30
 
31
        $this->listeners[$event][] = $listener;
32
 
33
        return $this;
34
    }
35
 
36
    public function once($event, callable $listener)
37
    {
38
        if ($event === null) {
39
            throw new InvalidArgumentException('event name must not be null');
40
        }
41
 
42
        if (!isset($this->onceListeners[$event])) {
43
            $this->onceListeners[$event] = [];
44
        }
45
 
46
        $this->onceListeners[$event][] = $listener;
47
 
48
        return $this;
49
    }
50
 
51
    public function removeListener($event, callable $listener)
52
    {
53
        if ($event === null) {
54
            throw new InvalidArgumentException('event name must not be null');
55
        }
56
 
57
        if (isset($this->listeners[$event])) {
58
            $index = \array_search($listener, $this->listeners[$event], true);
59
            if (false !== $index) {
60
                unset($this->listeners[$event][$index]);
61
                if (\count($this->listeners[$event]) === 0) {
62
                    unset($this->listeners[$event]);
63
                }
64
            }
65
        }
66
 
67
        if (isset($this->onceListeners[$event])) {
68
            $index = \array_search($listener, $this->onceListeners[$event], true);
69
            if (false !== $index) {
70
                unset($this->onceListeners[$event][$index]);
71
                if (\count($this->onceListeners[$event]) === 0) {
72
                    unset($this->onceListeners[$event]);
73
                }
74
            }
75
        }
76
    }
77
 
78
    public function removeAllListeners($event = null)
79
    {
80
        if ($event !== null) {
81
            unset($this->listeners[$event]);
82
        } else {
83
            $this->listeners = [];
84
        }
85
 
86
        if ($event !== null) {
87
            unset($this->onceListeners[$event]);
88
        } else {
89
            $this->onceListeners = [];
90
        }
91
    }
92
 
93
    public function listeners($event = null): array
94
    {
95
        if ($event === null) {
96
            $events = [];
97
            $eventNames = \array_unique(
98
                \array_merge(\array_keys($this->listeners), \array_keys($this->onceListeners))
99
            );
100
            foreach ($eventNames as $eventName) {
101
                $events[$eventName] = \array_merge(
102
                    isset($this->listeners[$eventName]) ? $this->listeners[$eventName] : [],
103
                    isset($this->onceListeners[$eventName]) ? $this->onceListeners[$eventName] : []
104
                );
105
            }
106
            return $events;
107
        }
108
 
109
        return \array_merge(
110
            isset($this->listeners[$event]) ? $this->listeners[$event] : [],
111
            isset($this->onceListeners[$event]) ? $this->onceListeners[$event] : []
112
        );
113
    }
114
 
115
    public function emit($event, array $arguments = [])
116
    {
117
        if ($event === null) {
118
            throw new InvalidArgumentException('event name must not be null');
119
        }
120
 
121
        if (isset($this->listeners[$event])) {
122
            foreach ($this->listeners[$event] as $listener) {
123
                $listener(...$arguments);
124
            }
125
        }
126
 
127
        if (isset($this->onceListeners[$event])) {
128
            $listeners = $this->onceListeners[$event];
129
            unset($this->onceListeners[$event]);
130
            foreach ($listeners as $listener) {
131
                $listener(...$arguments);
132
            }
133
        }
134
    }
135
}