From 4a4e139c8391986ce54585f3292f3c2e40dd624d Mon Sep 17 00:00:00 2001
From: Robin Appelman <icewind@owncloud.com>
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);
+	}
 }
-- 
GitLab