From 4a4e139c8391986ce54585f3292f3c2e40dd624d Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Mon, 8 Jul 2013 16:54:26 +0200 Subject: [PATCH] forward previously registerd hooks --- lib/hooks/basicemitter.php | 2 +- lib/hooks/forwardingemitter.php | 8 ++++++++ tests/lib/hooks/forwardingemitter.php | 12 ++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/hooks/basicemitter.php b/lib/hooks/basicemitter.php index e615a58cfe..9ffe1af231 100644 --- a/lib/hooks/basicemitter.php +++ b/lib/hooks/basicemitter.php @@ -13,7 +13,7 @@ abstract class BasicEmitter implements Emitter { /** * @var (callable[])[] $listeners */ - private $listeners = array(); + protected $listeners = array(); /** * @param string $scope diff --git a/lib/hooks/forwardingemitter.php b/lib/hooks/forwardingemitter.php index 518641ac7c..1aacc4012e 100644 --- a/lib/hooks/forwardingemitter.php +++ b/lib/hooks/forwardingemitter.php @@ -38,5 +38,13 @@ abstract class ForwardingEmitter extends BasicEmitter { */ protected function forward($emitter) { $this->forwardEmitters[] = $emitter; + + //forward all previously connected hooks + foreach ($this->listeners as $key => $listeners) { + list($scope, $method) = explode('::', $key, 2); + foreach ($listeners as $listener) { + $emitter->listen($scope, $method, $listener); + } + } } } diff --git a/tests/lib/hooks/forwardingemitter.php b/tests/lib/hooks/forwardingemitter.php index 0686ebece9..decf6bb354 100644 --- a/tests/lib/hooks/forwardingemitter.php +++ b/tests/lib/hooks/forwardingemitter.php @@ -59,4 +59,16 @@ class ForwardingEmitter extends BasicEmitter { $baseEmitter1->emit('Test', 'test2'); $this->assertEquals(2, $hookCalled); } + + public function testForwardExistingHooks() { + $baseEmitter = new PublicEmitter(); + $forwardingEmitter = new DummyForwardingEmitter(); + $hookCalled = false; + $forwardingEmitter->listen('Test', 'test', function () use (&$hookCalled) { + $hookCalled = true; + }); + $forwardingEmitter->forward($baseEmitter); + $baseEmitter->emit('Test', 'test'); + $this->assertTrue($hookCalled); + } }