<?php
/**
*
* Copyright (c) 2017, Till Wehowski
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the frdl/webfan.
* 4. Neither the name of frdl/webfan nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY frdl/webfan ''AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL frdl/webfan BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
/**
* EventEmitter javascript like event based final state object :
* https://github.com/frdl/-Flow/blob/master/api-d/4/js-api/library.js/core/plugin.core.js#L4501
*/
namespace Webfan\Homepagesystem\EventFlow;
//use SuperClosure\Serializer;
//use SuperClosure\Analyzer\AstAnalyzer;
//use SuperClosure\Analyzer\TokenAnalyzer;
use webfan\hps\Event as Event;
class State extends \frdl\Flow\EventEmitter
{
public function once($event, $callback, $obj = null) {
$THAT =$this;
$obj = $obj;
$callback= $callback;
$listener = (function() use($event, &$callback, &$THAT, &$obj, &$listener){
$THAT->removeEventListener($event, $listener);
call_user_func_array(($obj === null) ? $callback : array($obj, $callback), func_get_args());
});
$this->on($event, $listener);
return $this;
}
public function removeEventListener($event, $listener){
if (!isset($this->events[$event])) return $this;
$indexOf = 0;
foreach ($this->Iterator('Array', $this->events[$event]) as $EventListener) {
// if($EventListener === $listener) {
if(spl_object_id((object)$EventListener) === spl_object_id((object)$listener)) {
array_splice($this->events[$event], $indexOf, 1);
$indexOf--;
}
$indexOf++;
}
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_callable($callback)){
trigger_error('Cannot trigger Event '.$eventName.' on Listener #'.$indexOf, E_USER_WARNING);
continue;
}
if(false === call_user_func_array($callback, $payload))break;
if($event->isDefaultPrevented()){
$event->setResult(null);
break;
}
if($event->isPropagationStopped()){
break;
}
$indexOf++;
}
return $this;
}
function __destruct(){
}
}
|