public function testAddRemoveListener()
 {
     $dispatcher = new EventDispatcher();
     $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch());
     $tdispatcher->addListener('foo', $listener = function () {
     });
     $listeners = $dispatcher->getListeners('foo');
     $this->assertCount(1, $listeners);
     $this->assertSame($listener, $listeners[0]);
     $tdispatcher->removeListener('foo', $listener);
     $this->assertCount(0, $dispatcher->getListeners('foo'));
 }
 public function testListenerCanRemoveItselfWhenExecuted()
 {
     $eventDispatcher = new TraceableEventDispatcher(new EventDispatcher(), new Stopwatch());
     $listener1 = function () use($eventDispatcher, &$listener1) {
         $eventDispatcher->removeListener('foo', $listener1);
     };
     $eventDispatcher->addListener('foo', $listener1);
     $eventDispatcher->addListener('foo', function () {
     });
     $eventDispatcher->dispatch('foo');
     $this->assertCount(1, $eventDispatcher->getListeners('foo'), 'expected listener1 to be removed');
 }