1: <?php
2: /**
3: * @author Jefferson González
4: * @license MIT
5: */
6:
7: namespace Peg\Lib\Signals;
8:
9: /**
10: * Signal management that can be implemented at a per object basic.
11: */
12: class Signal
13: {
14: /**
15: * @var array
16: */
17: private $listeners;
18:
19: /**
20: * Default constructor
21: */
22: public function __construct()
23: {
24: $this->listeners = array();
25: }
26:
27: /**
28: * Calls all callbacks listening for a given signal type.
29: * @param string $signal_type
30: * @param \Peg\Lib\Signals\SignalData $signal_data
31: */
32: public function Send($signal_type, \Peg\Lib\Signals\SignalData &$signal_data=null)
33: {
34: if(!isset($this->listeners[$signal_type]))
35: return;
36:
37: foreach($this->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 function Listen($signal_type, $callback, $priority=10)
55: {
56: if(!isset($this->listeners[$signal_type]))
57: $this->listeners[$signal_type] = array();
58:
59: $this->listeners[$signal_type][] = array(
60: 'callback'=>$callback,
61: 'priority'=>$priority
62: );
63:
64: $this->listeners[$signal_type] = SignalHandler::Sort(
65: $this->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 function Unlisten($signal_type, $callback)
75: {
76: if(!isset($this->listeners[$signal_type]))
77: return;
78:
79: foreach($this->listeners[$signal_type] as $position=>$callback_data)
80: {
81: $stored_callback = $callback_data['callback'];
82:
83: if($callback == $stored_callback)
84: {
85: unset($this->listeners[$signal_type][$position]);
86: return;
87: }
88: }
89: }
90: }