69 lines
1.6 KiB
PHP
69 lines
1.6 KiB
PHP
|
<?php
|
||
|
|
||
|
/*
|
||
|
* This file is part of Evenement.
|
||
|
*
|
||
|
* (c) Igor Wiedler <igor@wiedler.ch>
|
||
|
*
|
||
|
* For the full copyright and license information, please view the LICENSE
|
||
|
* file that was distributed with this source code.
|
||
|
*/
|
||
|
|
||
|
namespace Evenement;
|
||
|
|
||
|
trait EventEmitterTrait
|
||
|
{
|
||
|
protected $listeners = [];
|
||
|
|
||
|
public function on($event, callable $listener)
|
||
|
{
|
||
|
if (!isset($this->listeners[$event])) {
|
||
|
$this->listeners[$event] = [];
|
||
|
}
|
||
|
|
||
|
$this->listeners[$event][] = $listener;
|
||
|
}
|
||
|
|
||
|
public function once($event, callable $listener)
|
||
|
{
|
||
|
$onceListener = function () use (&$onceListener, $event, $listener) {
|
||
|
$this->removeListener($event, $onceListener);
|
||
|
|
||
|
call_user_func_array($listener, func_get_args());
|
||
|
};
|
||
|
|
||
|
$this->on($event, $onceListener);
|
||
|
}
|
||
|
|
||
|
public function removeListener($event, callable $listener)
|
||
|
{
|
||
|
if (isset($this->listeners[$event])) {
|
||
|
$index = array_search($listener, $this->listeners[$event], true);
|
||
|
if (false !== $index) {
|
||
|
unset($this->listeners[$event][$index]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function removeAllListeners($event = null)
|
||
|
{
|
||
|
if ($event !== null) {
|
||
|
unset($this->listeners[$event]);
|
||
|
} else {
|
||
|
$this->listeners = [];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public function listeners($event)
|
||
|
{
|
||
|
return isset($this->listeners[$event]) ? $this->listeners[$event] : [];
|
||
|
}
|
||
|
|
||
|
public function emit($event, array $arguments = [])
|
||
|
{
|
||
|
foreach ($this->listeners($event) as $listener) {
|
||
|
call_user_func_array($listener, $arguments);
|
||
|
}
|
||
|
}
|
||
|
}
|