events; } public function on($event, $callback, $obj = null, &$index = null) { if (!isset($this->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); $cb = \Opis\Closure\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); $callback = \Opis\Closure\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; $cb = (is_callable($callback)) ? \Opis\Closure\serialize($callback) : $callback; $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; $cb = (is_callable($cb)) ? \Opis\Closure\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 )) ? $serializer->serialize($listener) : $listener; $sl =(is_callable( $listener )) ? \Opis\Closure\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 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); $events[$name][$index] = \Opis\Closure\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); $events[$name][$index] = \Opis\Closure\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); $data['events'][$name][$index] = \Opis\Closure\unserialize($listener); } } } $this->setEvents($data['events']); //if( $this->tagName !== $data['tagName']){ //warning ??? //} return $this; } } __halt_compiler();----SIGNATURE:----AJOvc0YgFkxPrhIr4FKmB3PvDfagfZ0ssyVaKKzRIRxYwplRg43UGKo+V1MxAWpEmoXGMgbTaLxmDWMmOtY1/RzqkmMskBMrZBqwvdwZreVVcfkF1gPGjjzkQHQsdUMEqEFZNOkJPzuaGCsGkm8Mj8rt05dDk55jLG86cpkM32BgxB6mioAjkAMNnLE1L2/UbeoWuUp+tSLQdmUYldr9vkIuoOZyLvMRqnwlRStXYmjL07YzYv/VoGSHityIg5WHMr93RYsS+z9mz8T9GQ/pLC3LUh6vh1/ezxmvn/hr5cw6F/inQiPRk0U5dZ65lQLeBeiAVrdT/eGAg8ck60s73AbFh+g7Oxt/lPQi/pQ0e+bm4rmAPO5ZoqHujknSal5AvBJBVXDiy/xPm6vXICyuvH5P6skkk6npXFSIxZVxOlpFChAIMbcSI90p9EeWx3fA65Co+Ep9bTwIi2MR6JEKUSc1YhW0WTMnhWOA9FxZ2gF0HnoNUszQlQ11si2rnGQrLFDgDd6SMboThX/Eek5Y3+u1CtZqKnFjmJ1C6/D5wznLGg5wm3KtG38Z1SmsTb3q+7iljTRbH2+XZdNBzLSDwYwwvGODdkqsvzpsl4szjBWiTYRSKE+qHV1UwJyFxI6Y13F92Jg/yHuXRu/BtVyx7FAIdo3HZys//sGe/SNvs4U=----ATTACHMENT:----MzYzOTkzOTIxMDk4NTMzNiA1OTU0NTc2MDAxNzM4MTE0IDk1NjczODY1OTgzNjI2OTc=