Overview

Namespaces

  • None
  • Peg
    • Cli
      • Commands
    • Config
    • Custom
      • Command
        • Action
          • Generate
          • Parse
      • CommandLine
      • Config
      • Localization
      • Utilities
    • Lib
      • Definitions
        • Element
      • Generator
      • Lexers
      • Plugins
      • Signals
        • Data
          • Definitions
          • Lexers
        • Type
  • PHP

Classes

  • Signal
  • SignalData
  • SignalHandler
  • Overview
  • Namespace
  • Class
  • Tree
  • Todo
  1: <?php
  2: /**
  3:  * @author Jefferson González
  4:  * @license MIT
  5:  */
  6: 
  7: namespace Peg\Lib\Signals;
  8: 
  9: /**
 10:  * Assist on the management of signals send at a global scope
 11:  * thru the whole system.
 12:  */
 13: class SignalHandler
 14: {
 15: 
 16:     /**
 17:      * @var array
 18:      */
 19:     private static $listeners = array();
 20: 
 21:     /**
 22:      * Disable constructor
 23:      */
 24:     private function __construct(){}
 25: 
 26:     /**
 27:      * Calls all callbacks listening for a given signal type.
 28:      * The $var1-$var6 are optional parameters passed to the callback.
 29:      * @param string $signal_type
 30:      * @param \Peg\Lib\Signals\SignalData $signal_data
 31:      */
 32:     public static function Send($signal_type, \Peg\Lib\Signals\SignalData &$signal_data = null)
 33:     {
 34:         if(!isset(self::$listeners[$signal_type]))
 35:             return;
 36: 
 37:         foreach(self::$listeners[$signal_type] as $callback_data)
 38:         {
 39:             $callback = $callback_data['callback'];
 40: 
 41:             if(is_object($signal_data))
 42:                 $callback($signal_data);
 43:             else
 44:                 $callback();
 45:         }
 46:     }
 47: 
 48:     /**
 49:      * Add a callback that listens to a specific signal.
 50:      * @param string $signal_type
 51:      * @param function $callback
 52:      * @param int $priority
 53:      */
 54:     public static function Listen($signal_type, $callback, $priority = 10)
 55:     {
 56:         if(!isset(self::$listeners[$signal_type]))
 57:             self::$listeners[$signal_type] = array();
 58: 
 59:         self::$listeners[$signal_type][] = array(
 60:             'callback' => $callback,
 61:             'priority' => $priority
 62:         );
 63: 
 64:         self::$listeners[$signal_type] = self::Sort(
 65:             self::$listeners[$signal_type], 'priority'
 66:         );
 67:     }
 68: 
 69:     /**
 70:      * Remove a callback from listening a given signal type.
 71:      * @param string $signal_type
 72:      * @param function $callback
 73:      */
 74:     public static function Unlisten($signal_type, $callback)
 75:     {
 76:         if(!isset(self::$listeners[$signal_type]))
 77:             return;
 78: 
 79:         if(is_array(self::$listeners[$signal_type]))
 80:         {
 81:             foreach(self::$listeners[$signal_type] as $position => $callback_data)
 82:             {
 83:                 $stored_callback = $callback_data['callback'];
 84: 
 85:                 if($callback == $stored_callback)
 86:                 {
 87:                     unset(self::$listeners[$signal_type][$position]);
 88:                     break;
 89:                 }
 90:             }
 91:         }
 92: 
 93:         if(count(self::$listeners[$signal_type]) <= 0)
 94:             unset(self::$listeners[$signal_type]);
 95:     }
 96:     
 97:     /**
 98:      * Sorts an array of listener function using bubble sort.
 99:      *
100:      * @param array $data_array The array to sort in the format returned by data_parser().
101:      * @param string $field_name The field we are using to sort the array by.
102:      * @param mixed $sort_method The type of sorting, default is ascending. 
103:      *
104:      * @return array The same array but sorted by the given field name.
105:      */
106:     public static function Sort($data_array, $field_name, $sort_method = SORT_ASC)
107:     {
108:         $sorted_array = array();
109: 
110:         if(is_array($data_array))
111:         {
112:             $field_to_sort_by = array();
113:             $new_id_position = array();
114: 
115:             foreach($data_array as $key=>$fields)
116:             {
117:                 $field_to_sort_by[$key] = $fields[$field_name];
118:                 $new_id_position[$key] = $key;
119:             }
120: 
121:             array_multisort($field_to_sort_by, $sort_method, $new_id_position, $sort_method);
122: 
123:             foreach($new_id_position as $id)
124:             {
125:                 $sorted_array[$id] = $data_array[$id];
126:             }
127:         }
128: 
129:         return $sorted_array;
130:     }
131: 
132: }
PEG Api API documentation generated by ApiGen 2.8.0