scratch – Blame information for rev

Subversion Repositories:
Rev:
Rev Author Line No. Line
115 office 1 <?php
2  
3 namespace Alchemy\BinaryDriver\Listeners;
4  
5 use SplObjectStorage;
6 use Evenement\EventEmitter;
7  
8 class Listeners extends EventEmitter
9 {
10 /** @var SplObjectStorage */
11 public $storage;
12  
13 public function __construct()
14 {
15 $this->storage = new SplObjectStorage();
16 }
17  
18 public function __clone()
19 {
20 $storage = $this->storage;
21 $this->storage = new SplObjectStorage();
22 $this->storage->addAll($storage);
23 }
24  
25 /**
26 * Registers a listener, pass the listener events to the target.
27 *
28 * @param ListenerInterface $listener
29 * @param null|EventEmitter $target
30 *
31 * @return ListenersInterface
32 */
33 public function register(ListenerInterface $listener, EventEmitter $target = null)
34 {
35 $EElisteners = array();
36  
37 if (null !== $target) {
38 $EElisteners = $this->forwardEvents($listener, $target, $listener->forwardedEvents());
39 }
40  
41 $this->storage->attach($listener, $EElisteners);
42  
43 return $this;
44 }
45  
46 /**
47 * Unregisters a listener, removes the listener events from the target.
48 *
49 * @param ListenerInterface $listener
50 *
51 * @return ListenersInterface
52 *
53 * @throws InvalidArgumentException In case the listener is not registered
54 */
55 public function unregister(ListenerInterface $listener)
56 {
57 if (!isset($this->storage[$listener])) {
58 throw new InvalidArgumentException('Listener is not registered.');
59 }
60  
61 foreach ($this->storage[$listener] as $event => $EElistener) {
62 $listener->removeListener($event, $EElistener);
63 }
64  
65 $this->storage->detach($listener);
66  
67 return $this;
68 }
69  
70 private function forwardEvents($source, $target, array $events)
71 {
72 $EElisteners = array();
73  
74 foreach ($events as $event) {
75 $listener = $this->createListener($event, $target);
76 $source->on($event, $EElisteners[$event] = $listener);
77 }
78  
79 return $EElisteners;
80 }
81  
82 private function createListener($event, $target)
83 {
84 return function () use ($event, $target) {
85 $target->emit($event, func_get_args());
86 };
87 }
88 }