/usr/share/php/Sabre/Event/EventEmitterTrait.php is in php-sabre-event 1.0.0-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | <?php
namespace Sabre\Event;
/**
* Event Emitter Trait
*
* This traits contains all the basic functions to implement an
* EventEmitterInterface.
*
* Using the trait + interface allows you to add EventEmitter capabilities
* without having to change your base-class.
*
* @copyright Copyright (C) 2013 fruux GmbH. All rights reserved.
* @author Evert Pot (http://evertpot.com/)
* @license https://raw.github.com/fruux/sabre-event/master/LICENSE
*/
trait EventEmitterTrait {
/**
* The list of listeners
*
* @var array
*/
protected $listeners = [];
/**
* Subscribe to an event.
*
* @param string $eventName
* @param callable $callBack
* @param int $priority
* @return void
*/
public function on($eventName, callable $callBack, $priority = 100) {
$listeners =& $this->listeners($eventName);
$listeners[] = [$priority, $callBack];
usort($listeners, function($a, $b) {
return $a[0]-$b[0];
});
}
/**
* Subscribe to an event exactly once.
*
* @param string $eventName
* @param callable $callBack
* @param int $priority
* @return void
*/
public function once($eventName, callable $callBack, $priority = 100) {
$wrapper = null;
$wrapper = function() use ($eventName, $callBack, &$wrapper) {
$this->removeListener($eventName, $wrapper);
$result = call_user_func_array($callBack, func_get_args());
};
$this->on($eventName, $wrapper);
}
/**
* Emits an event.
*
* This method will return true if 0 or more listeners were succesfully
* handled. false is returned if one of the events broke the event chain.
*
* @param string $eventName
* @param array $arguments
* @return bool
*/
public function emit($eventName, array $arguments = []) {
foreach($this->listeners($eventName) as $listener) {
$result = call_user_func_array($listener[1], $arguments);
if ($result === false) {
return false;
}
}
return true;
}
/**
* Returns the list of listeners for an event.
*
* The list is returned as an array. Every item is another array with 2
* elements: priority and the callback.
*
* The array is returned by reference, and can therefore be used to
* manipulate the list of events.
*
* @param string $eventName
* @return array
*/
public function &listeners($eventName) {
if (!isset($this->listeners[$eventName])) {
$this->listeners[$eventName] = [];
}
return $this->listeners[$eventName];
}
/**
* Removes a specific listener from an event.
*
* @param string $eventName
* @param callable $listener
* @return void
*/
public function removeListener($eventName, callable $listener) {
$listeners =& $this->listeners($eventName);
foreach($listeners as $index => $check) {
if ($check[1]===$listener) {
unset($listeners[$index]);
break;
}
}
}
/**
* Removes all listeners from the specified event.
*
* @param string $eventName
* @return void
*/
public function removeAllListeners($eventName) {
$listeners =& $this->listeners($eventName);
$listeners = [];
}
}
|