1: <?php
 2: 
 3: /**
 4:  * Picon Framework
 5:  * http://code.google.com/p/picon-framework/
 6:  *
 7:  * Copyright (C) 2011-2012 Martin Cassidy <martin.cassidy@webquub.com>
 8: 
 9:  * Picon Framework is free software: you can redistribute it and/or modify
10:  * it under the terms of the GNU General Public License as published by
11:  * the Free Software Foundation, either version 3 of the License, or
12:  * (at your option) any later version.
13: 
14:  * Picon Framework is distributed in the hope that it will be useful,
15:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17:  *  General Public License for more details.
18: 
19:  * You should have received a copy of the GNU General Public License
20:  * along with Picon Framework.  If not, see <http://www.gnu.org/licenses/>.
21:  * */
22: 
23: namespace picon;
24: 
25: /**
26:  * Represents a collection of listeners that are treated as one listener
27:  *
28:  * @author Martin Cassidy Cassidy
29:  * @package listeners
30:  */
31: abstract class ListenerCollection
32: {
33:     private $listeners = array();
34:     
35:     public function add($listener)
36:     {
37:         if(!$this->validateListener($listener))
38:         {
39:             throw new \InvalidArgumentException(sprintf("Listener of type %s was nat valid for the listener collection", get_class($listener)));
40:         }
41:         array_push($this->listeners, $listener);
42:     }
43:     
44:     public function remove($listener)
45:     {
46:         $index = null;
47:         array_walk($this->listeners, function($value, $key) use($listener, &$index)
48:         {
49:             if($value==$listener)
50:             {
51:                 $index = $key;
52:             }
53:         });
54:         if($index!=null)
55:         {
56:             unset($this->listeners[$index]);
57:         }
58:     }
59:     
60:     /**
61:      *
62:      * @param closure $callback 
63:      */
64:     public function notify($callback)
65:     {
66:         Args::callBackArgs($callback, 1, 'callback');
67:         
68:         foreach($this->listeners as $listener)
69:         {
70:             $callback($listener);
71:         }
72:     }
73:     
74:     /**
75:      * @param $listener The listener to validate
76:      * @return Boolean true if the listener is valid
77:      */
78:     protected abstract function validateListener($listener);
79: }
80: 
81: ?>
82: