| 
<?phpnamespace webfan\hps;
 
 use webfan\hps\EmitterInterface;
 
 //abstract
 class Event
 {
 /**
 * Has propagation stopped?
 *
 * @var bool
 */
 protected $propagationStopped = false;
 protected $defaultPrevented = false;
 /**
 * The emitter instance.
 *
 * @var EmitterInterface|null
 */
 protected $emitter;
 /**
 * The event name.
 *
 * @var string
 */
 protected $name;
 
 /**
 * @var mixed
 */
 protected $result;
 
 /**
 * @var array
 */
 protected $arguments;
 
 
 protected $exception;
 
 
 
 
 /**
 * Create a new event instance.
 *
 * @param string $name
 */
 public function __construct($name = null, EmitterInterface $emitter = null)
 {
 if(null===$name)$name=get_class($this);
 $this->name = $name;
 
 // $this->result = $result;
 //   $this->arguments = $arguments;
 
 if(null !== $emitter){
 $this->setEmitter($emitter);
 }
 }
 
 public function __call($name, $args)
 {
 if('is'===substr($name, 0, 2) && is_callable([$this, 'is' . substr($name, 2, strlen($name))])){
 return call_user_func_array([$this, 'is' . substr($name, 2, strlen($name))], $args);
 }elseif('is'===substr($name, 0, 2) && is_callable([$this, '_is'])){
 array_unshift($args,  substr($name, 2, strlen($name)) );
 return call_user_func_array([$this, '_is'], $args);
 }
 }
 
 public function _is($type){
 $type = strtolower($type);
 return (      $type === substr($this->getName(), 0, strlen($type))
 ||    $type === substr($this->getName(), strlen($this->getName()) - strlen($type),  strlen($this->getName()))
 ) ? true : false;
 }
 
 
 
 public function getException(){
 return $this->exception;
 }
 
 public function setException(\Exception $e){
 $this->exception = $e;
 }
 public function hasException(){
 return (is_object($this->exception) && $this->exception instanceof \Exception) ? true : false;
 }
 
 
 
 
 /**
 * Set an argument value.
 *
 * @param string $key
 * @param mixed  $value
 *
 * @return $this
 */
 public function setArgument($key, $value)
 {
 $this->arguments[$key] = $value;
 
 return $this;
 }
 public function setArgumentReference($key, &$value)
 {
 $this->arguments[$key] = $value;
 
 return $this;
 }
 
 /**
 * Set the arguments.
 *
 * @param array $arguments
 *
 * @return self
 */
 public function setArguments(array $arguments)
 {
 $this->arguments = array_merge($this->arguments, $arguments);
 
 return $this;
 }
 
 /**
 * Set the result, used when the operation is canceled.
 *
 * @param mixed $result
 *
 * @return self
 */
 public function setResult($result = null)
 {
 $this->result = $result;
 
 return $this;
 }
 
 /**
 * Get the result, used when the operation is canceled.
 *
 * @return mixed
 */
 public function getResult()
 {
 return $this->result;
 }
 
 /**
 * Cancel the operation.
 *
 * @param mixed $result
 */
 public function cancelOperation($result = null)
 {
 $this->setResult($result);
 $this->stopPropagation();
 }
 
 
 
 
 /**
 * Get the passed arguments.
 *
 * @return array method arguments
 */
 public function getArguments()
 {
 return $this->arguments;
 }
 
 /**
 * Get an argument by key.
 *
 * @param string $key argument key
 *
 * @throws ErrorException
 *
 * @return mixed
 */
 public function getArgument($key)
 {
 if (!$this->hasArgument($key) ) {
 // throw new \Exception('Undefined index: '.$key);
 return null;
 }
 
 return $this->arguments[$key];
 }
 
 public function hasArgument($key)
 {
 return ( array_key_exists($key, $this->arguments)) ? true : false;
 }
 
 /**
 * Get the event name.
 *
 * @return string
 */
 public function getName()
 {
 return $this->name;
 }
 
 
 
 /**
 * Set the Emitter.
 *
 * @param EmitterInterface $emitter
 *
 * @return $this
 */
 public function setEmitter(EmitterInterface $emitter = null)
 {
 $this->emitter = $emitter;
 
 return $this;
 }
 
 /**
 * Get the Emitter.
 *
 * @return EmitterInterface
 */
 public function getEmitter()
 {
 return $this->emitter;
 }
 
 /**
 * Stop event propagation.
 *
 * @return $this
 */
 public function stopPropagation()
 {
 $this->propagationStopped = true;
 
 return $this;
 }
 
 /**
 * Check weather propagation was stopped. defaultPrevented
 *
 * @return bool
 */
 public function isPropagationStopped()
 {
 return $this->propagationStopped;
 }
 
 
 
 public function preventDefault()
 {
 $this->defaultPrevented = true;
 
 return $this;
 }
 
 
 public function isDefaultPrevented()
 {
 return $this->defaultPrevented;
 }
 
 
 }
 
 |