<?php 
namespace 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; 
    } 
 
 
} 
 
 |