Guest User

observable

a guest
Jul 22nd, 2010
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.45 KB | None | 0 0
  1. class Observable implements IObservable
  2. {
  3.     protected $_events = Array();
  4.  
  5.     function __construct()
  6.     {
  7.  
  8.     }
  9.  
  10.     /**
  11.      * registerEvents('fooEvent');
  12.      * registerEvents(Array('fooEvent','barEvent'));
  13.      */
  14.     function registerEvents($events)
  15.     {
  16.         if ( !is_array($events) ) $events = Array($events);
  17.         foreach ( $events as $eventId ){
  18.             if ( isset($this->_events[$eventId]) )
  19.             throw new Exception("Event already registered: $eventId");
  20.             $this->_events[$eventId] = Array();
  21.         }
  22.     }
  23.  
  24.     function isRegistered($eventId)
  25.     {
  26.         return isset($this->_events[$eventId]);
  27.     }
  28.  
  29.     /**
  30.      * on('click','myFunction');
  31.      * on('click','myFunction',$this);
  32.      * on('click','myFunction',$this,$customArguments);
  33.      */
  34.     function on($eventId,$callback,$context=null,$addArg=null)
  35.     {
  36.         if ( !isset($this->_events[$eventId]) )
  37.         throw new Exception("Event not registered: $eventId");
  38.  
  39.         $handler = $this->_makeHandler($callback,$context,$addArg);
  40.         $this->_events[$eventId][] = $handler;
  41.     }
  42.  
  43.     function un($eventId,$callback,$context=null,$addArg=null)
  44.     {
  45.         if ( !isset($this->_events[$eventId]) )
  46.         throw new Exception("Event not exists: $eventId");
  47.  
  48.         $handler = $this->_makeHandler($callback,$context,$addArg);
  49.         foreach ( $this->_events[$eventId] as $index => $h )
  50.         {
  51.             if ( $h === $handler )
  52.             {
  53.                 unset($this->_events[$eventId][$index]);
  54.             }
  55.         }
  56.     }
  57.  
  58.     /**
  59.      * fireEvent($eventId)
  60.      * fireEvent($eventId,$arg1,$arg2,...,$argX)
  61.      */
  62.     function fireEvent($eventId)
  63.     {
  64.         if ( func_num_args() < 1 )
  65.         throw new Exception('At least one argument required');
  66.         $args = func_get_args();
  67.         $eventId = $args[0];
  68.         array_shift($args);
  69.  
  70.         if ( !isset($this->_events[$eventId]) )
  71.         throw new Exception("Event not registered: $eventId");
  72.  
  73.         foreach ( $this->_events[$eventId] as $handler )
  74.         {
  75.             $callback = $handler[0];
  76.             $resultArgs = $args;
  77.             if ( $handler[1] === null )
  78.             {
  79.                 $resultArgs = $args;
  80.             }else
  81.             if ( is_array($handler[1]) )
  82.             {
  83.                 $resultArgs = array_merge($args,$handler[1]);
  84.             }else
  85.             {
  86.                 $resultArgs = $args;
  87.                 $resultArgs[] = $handler[1];
  88.             }
  89.             $result = call_user_func_array($callback,$resultArgs);
  90.             if ( $result === false ) return false;
  91.         }
  92.         return true;
  93.     }
  94.  
  95.     function _makeHandler($callback,$context=null,$void=null)
  96.     {
  97.         if ( !is_string($callback) )
  98.         throw new Exception('Callback must be a string value');
  99.         if ( $context ) $callback = Array($context,$callback);
  100.         return Array($callback,$void);
  101.     }
  102.  
  103. }
Advertisement
Add Comment
Please, Sign In to add comment