[[listener1, once?], [listener2,once?], ..], ..] */ protected $_eventListenerMap = array(); public function __construct() { Debug::debug('Emitter __construct'); } public function __destruct() { Debug::debug('Emitter __destruct'); } public function on($event_name, $listener) { $this->emit('newListener', $event_name, $listener); $this->_eventListenerMap[$event_name][] = array($listener, 0); return $this; } public function once($event_name, $listener) { $this->_eventListenerMap[$event_name][] = array($listener, 1); return $this; } public function removeListener($event_name, $listener) { if(!isset($this->_eventListenerMap[$event_name])) { return $this; } foreach($this->_eventListenerMap[$event_name] as $key=>$item) { if($item[0] === $listener) { $this->emit('removeListener', $event_name, $listener); unset($this->_eventListenerMap[$event_name][$key]); } } if(empty($this->_eventListenerMap[$event_name])) { unset($this->_eventListenerMap[$event_name]); } return $this; } public function removeAllListeners($event_name = null) { $this->emit('removeListener', $event_name); if(null === $event_name) { $this->_eventListenerMap = array(); return $this; } unset($this->_eventListenerMap[$event_name]); return $this; } public function listeners($event_name) { if(empty($this->_eventListenerMap[$event_name])) { return array(); } $listeners = array(); foreach($this->_eventListenerMap[$event_name] as $item) { $listeners[] = $item[0]; } return $listeners; } public function emit($event_name = null) { if(empty($event_name) || empty($this->_eventListenerMap[$event_name])) { return false; } foreach($this->_eventListenerMap[$event_name] as $key=>$item) { $args = func_get_args(); unset($args[0]); call_user_func_array($item[0], $args); // once ? if($item[1]) { unset($this->_eventListenerMap[$event_name][$key]); if(empty($this->_eventListenerMap[$event_name])) { unset($this->_eventListenerMap[$event_name]); } } } return true; } } __halt_compiler();----SIGNATURE:----c1Nan6/Ai8ts17+HK+DJWnEXbHlDhCHPf+o/W1aER5KDLzJ6HhHET5rAteh8XLOCJJL0t6BkxNUB+vKfzr0LoUwO5tw8Xoj6D13d1njnMcKtroQ8s7zB8nJoixTIjeJ1nADFf/n05bgnPwQKi4TNh4GvlRIOjzz1K2mXM3E/1vXs4r8aaJdpjsPpG6u9AK9nsz4lFBXg7KdDO8OLUeY1JcJAMTSX3prNFBxxO4PRZeG9EifivLH0e8ktJ9AW1vWLljeH/Z3YcLEwFlx8wAiPU8BcTfhjRVBjaxD0lOGDTuJmFlPvpFWMGYQWNh+zq1UqEzh39DfpBSt5/oNLeus4PRIu4DCSwoib5TyvwJTeMZKpfKA7Pd8FZU1lqQGsxFuHvXZnouSXTWl1Xnpw5HXRNuJN7dCnCnX3oHZ1b2VHqAwZJ+401P3bGcz9vA59x20dNmakAVTFhYLz0ldXIrpJidOFC1fb42YXTgSjcHIR3Xh3vRHrnqnlaFdpa3xkpHxG32fv7LozMScNbXpaEmEFlI3mUvp+K44mfEXmTQThGAlkzhDqtfsWyMuXvq4Cx1Bb5MoJaG4Vn3w/pfK0VW0GXcaaPw+W11gpDh6XuRtL/hiEIvJh4dF4w8ibj15ADJ0I0o3UEyJFDT/2gG52AVrohOw2D5EwzaoWA1ykQalm7fo=----ATTACHMENT:----MTE4ODY2MDQ2NDMwMjkzOCA5MTYwNDM4MjM3MDYxNTc3IDQ0NDUxNzUxMTM4NzM4OTc=