events[$event])) { $this->events[$event] = []; } if(null===$index){ // $bin = new \frdl\webfan\Serialize\Binary\bin; //$index = $bin->serialize($cb); $index = $this->_genKey($callback); } if($obj === null){ if(true===$this->serializeClosures){ $serializer = (null=== $this->SecretSigningKey) ? new \SuperClosure\Serializer() : new \SuperClosure\Serializer(null, $this->SecretSigningKey); $cb = $serializer->serialize($callback); }else{ $cb = $callback; } }else{ $cb = [$obj, $callback]; } $this->events[$event][$index] = $cb; // $this->events[$event][] = $cb; return $this; } public function trigger($eventName, $data = [], Event &$event = null) { if (!isset($this->events[$eventName])) return $this; $indexOf=0; foreach ($this->Iterator('Array', $this->events[$eventName]) as $callback) { $payload = array(); $target = &$this; $evData = &$data; array_push($payload, $eventName); array_push($payload, $target); array_push($payload, $evData); if(null===$event){ if(!is_object($data) || true !== $data instanceof Event){ $event = new Event($eventName); }elseif(true === $data instanceof Event){ $event = &$data; } } if(!is_object($data) || true !== $data instanceof Event){ $payload[] = &$event; } if(is_string($callback)){ $serializer = (null=== $this->SecretSigningKey) ? new \SuperClosure\Serializer() : new \SuperClosure\Serializer(null, $this->SecretSigningKey); $callback = $serializer->unserialize($callback); } if(!is_callable($callback)){ trigger_error('Cannot trigger Event '.$eventName.' on Listener #'.$indexOf, E_USER_WARNING); continue; } // if(frdl\run($callback, $payload) === false) break; if(false === call_user_func_array($callback, $payload))break; if($event->isDefaultPrevented()){ $event->setResult(null); break; } if($event->isPropagationStopped()){ break; } $indexOf++; } return $this; } public function once($event, $callback, $obj = null) { $THAT = $this; $k = $this->_genKey($callback); $callback= ($obj === null) ? $callback : [$obj, $callback]; $serializer = (null=== $this->SecretSigningKey) ? new \SuperClosure\Serializer() : new \SuperClosure\Serializer(null, $this->SecretSigningKey); $cb = (is_callable($callback)) ? $serializer->serialize($callback) : $callback; // $bin = new \frdl\webfan\Serialize\Binary\bin; // $k = $bin->serialize( $cb ); $func =function($event, $THAT, $data) use($cb, $k){ $callback = unserialize($cb); // $THAT->removeEventListener($event, $fn); // unset($THAT->events[$event][$k]); // $THAT->removeEventListener($event, $k); $events = $THAT->getEvents(); unset($events[$event][$k]); $THAT->setEvents($events); $res = call_user_func_array($callback, func_get_args()); return $res; }; $this->on($event, $func, null, $k); return $this; } protected function _genKey($cb) { $serializer = (null=== $this->SecretSigningKey) ? new \SuperClosure\Serializer() : new \SuperClosure\Serializer(null, $this->SecretSigningKey); $cb = (is_callable($cb)) ? $serializer->serialize($cb) : $cb; $bin = new \frdl\webfan\Serialize\Binary\bin; $d = $bin->serialize( $cb ); $k = sha1($d).strlen($d); return $k; } public function removeEventListener($event, $callback, $obj = null) { if (!isset($this->events[$event])) return $this; $events = $this->events; $listener = ($obj === null) ? $callback : array($obj, $callback); $serializer = (null=== $this->SecretSigningKey) ? new \SuperClosure\Serializer() : new \SuperClosure\Serializer(null, $this->SecretSigningKey); $bin = new \frdl\webfan\Serialize\Binary\bin; // $sl =(is_callable( $listener )) ? $bin->serialize($serializer->serialize($listener)) : $bin->serialize($listener); $sl =(is_callable( $listener )) ? $serializer->serialize($listener) : $listener; // $indexOf = 0; // foreach ($this->Iterator('Array', $events[$event]) as $indexOf => $EventListener) { foreach ($events[$event] as $indexOf => $EventListener) { /* if(is_string($listener)&& !is_array($EventListener) && !is_string($EventListener) ){ $EventListener = $serializer->serialize($EventListener); } */ if($EventListener ===$sl || $EventListener === $bin->serialize($sl) || $EventListener === $listener || $indexOf === $listener || $indexOf === $sl || $indexOf === $this->_genKey($callback) ) { // array_splice($this->events[$event], $indexOf, 0); unset($events[$event][$indexOf]); if(0===count($events[$event]))unset($events[$event]); // $indexOf--; } // $indexOf++; } $this->events=$events; return $this; } public function setSecretSigningKey($key) { $this->SecretSigningKey = $key; return $this; } public function getEvents() { return $this->events; } public function test() { echo '
test; '.__METHOD__.'
'; return $this; } public function setEvents($events) { $this->events = $events; return $this; } public function serialize() { // echo "Serializing MyClass...\n"; // return serialize($this->data); $events = $this->events; foreach($events as $name => $listeners){ foreach( $listeners as $index => $listener){ if(is_array($listener) ){ $list=$listener; $l = function() use($list){ return call_user_func_array($list, func_get_args()); }; $serializer = (null=== $this->SecretSigningKey) ? new \SuperClosure\Serializer() : new \SuperClosure\Serializer(null, $this->SecretSigningKey); $events[$name][$index] = $serializer->serialize($l); } elseif( !is_string($listener) ){ $serializer = (null=== $this->SecretSigningKey) ? new \SuperClosure\Serializer() : new \SuperClosure\Serializer(null, $this->SecretSigningKey); $events[$name][$index] = $serializer->serialize($listener); } else { $events[$name][$index] = $listener; } } } $context = $this->_context; $context = serialize($context); $data = array( 'events' => $this->events, //'tagName' => $this->tagName, "name" => $this->name, 'context' => $context ); $bin = new \frdl\webfan\Serialize\Binary\bin; return $bin->serialize($data); } public function unserialize($data) { // echo "Unserializing MyClass...\n"; // $this->data = unserialize($data); $bin = new \frdl\webfan\Serialize\Binary\bin; $data = $bin->unserialize($data); $data['context'] = unserialize($data['context']); $this->_context=$data['context']; $this->name = $data['name']; //print_r($data['events']);die(); foreach($data['events'] as $name => $listeners){ foreach( $listeners as $index => $listener){ if( !is_string($listener) && !is_array($listener) ){ $serializer = (null=== $this->SecretSigningKey) ? new \SuperClosure\Serializer() : new \SuperClosure\Serializer(null, $this->SecretSigningKey); $data['events'][$name][$index] = $serializer->unserialize($listener); } } } $this->setEvents($data['events']); //if( $this->tagName !== $data['tagName']){ //warning ??? //} } } __halt_compiler();----SIGNATURE:----NmdOcImP6yboLaP2hbJo0bIUM5o+5DcwOlT1RNhy7C1o/l7pMbagkrKd3KiGjLtp/us0eEG51SQ93JM7HYwAgP7W39LocjvoI4TL7FjzDqP03VcsABjS8dE6vxxLNORV1Z635PrLnwH3eN1NNFYvyHeyL6Ij9quWzY0gM60K7VOB90PS1WDenYkZrr1mZNewa2sOx7FRdr5l3Kdm2XfjBYm+c9j5FnWx+3jMgZJnvNf9x2BlKG1VX5t+WpYbr00fbMOZZPb+UpeVeAzyVGtjn3yiE7FT4zQlsSAaEjm5Ul/mM9xKTAmB3JEdZHU+t4lomRC1WP7ZHwnGybLVrN3v0ktBaVYFkEzawRALxHpz8vICYs7x5tNLRf7VnuArFC1QqOW7cBHRIHrnacm7gmI4/1hXFRnl4Odwz8mi105y2qGq/84TcHbDTmGSq2ayiub8kJign7r+vbHw1lqSjXhzbshMnIbt9UqNSiw/Xi+c2eAHJJr6wYa2zq7BlfGw4vcz99qUJR0PpzusE0UbGdT9+/yHu4Z/iUPPlYRzxNhudv3VIeOVfQ1j3C7b4jkrZTyNv+0AIhNCDoXRPgOCgFY4XrBnCCgn6QfF0NvmFhnJiwX3tGbphV7HJzTcZR7JOxFnM8ITNp2eKHddZrDPA+HD51pFA9+X0+iFWpGj/wMZp30=----ATTACHMENT:----MzgxOTQ2MDcxNzA2MjY2NiAzOTIzNTIxODU5NzA4NjEgNjg4Njg2NDQwNDc1MDIyMA==