From b8a421a86db09c7ed106c2f9aee15aa337761e4a Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Tue, 7 May 2013 16:34:09 +0200 Subject: New hook system --- lib/hooks/basicemitter.php | 89 +++++++++++++++++++++++++++++++++++++++++++++ lib/hooks/emitter.php | 32 ++++++++++++++++ lib/hooks/legacyemitter.php | 16 ++++++++ 3 files changed, 137 insertions(+) create mode 100644 lib/hooks/basicemitter.php create mode 100644 lib/hooks/emitter.php create mode 100644 lib/hooks/legacyemitter.php (limited to 'lib/hooks') diff --git a/lib/hooks/basicemitter.php b/lib/hooks/basicemitter.php new file mode 100644 index 00000000000..bd24539a40b --- /dev/null +++ b/lib/hooks/basicemitter.php @@ -0,0 +1,89 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\Hooks; + +abstract class BasicEmitter implements Emitter { + + /** + * @var (callable[])[] $listeners + */ + private $listeners = array(); + + /** + * @param string $scope + * @param string $method + * @param callable $callback + */ + public function listen($scope, $method, $callback) { + $eventName = $scope . '::' . $method; + if (!isset($this->listeners[$eventName])) { + $this->listeners[$eventName] = array(); + } + if (array_search($callback, $this->listeners[$eventName]) === false) { + $this->listeners[$eventName][] = $callback; + } + } + + /** + * @param string $scope optional + * @param string $method optional + * @param callable $callback optional + */ + public function remoteListener($scope = null, $method = null, $callback = null) { + $names = array(); + $allNames = array_keys($this->listeners); + if ($scope and $method) { + $name = $scope . '::' . $method; + if (isset($this->listeners[$name])) { + $names[] = $name; + } + } elseif ($scope) { + foreach ($allNames as $name) { + $parts = explode('::', $name, 2); + if ($parts[0] == $scope) { + $names[] = $name; + } + } + } elseif ($method) { + foreach ($allNames as $name) { + $parts = explode('::', $name, 2); + if ($parts[1] == $method) { + $names[] = $name; + } + } + } else { + $names = $allNames; + } + + foreach ($names as $name) { + if ($callback) { + $index = array_search($callback, $this->listeners[$name]); + if ($index !== false) { + unset($this->listeners[$name][$index]); + } + } else { + $this->listeners[$name] = array(); + } + } + } + + /** + * @param string $scope + * @param string $method + * @param array $arguments optional + */ + protected function emit($scope, $method, $arguments = array()) { + $eventName = $scope . '::' . $method; + if (isset($this->listeners[$eventName])) { + foreach ($this->listeners[$eventName] as $callback) { + call_user_func_array($callback, $arguments); + } + } + } +} diff --git a/lib/hooks/emitter.php b/lib/hooks/emitter.php new file mode 100644 index 00000000000..4219b6f3545 --- /dev/null +++ b/lib/hooks/emitter.php @@ -0,0 +1,32 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\Hooks; + +/** + * Class Emitter + * + * interface for all classes that are able to emit events + * + * @package OC\Hooks + */ +interface Emitter { + /** + * @param string $scope + * @param string $method + * @param callable $callback + */ + public function listen($scope, $method, $callback); + + /** + * @param string $scope optional + * @param string $method optional + * @param callable $callback optional + */ + public function remoteListener($scope = null, $method = null, $callback = null); +} diff --git a/lib/hooks/legacyemitter.php b/lib/hooks/legacyemitter.php new file mode 100644 index 00000000000..a2d16ace9a7 --- /dev/null +++ b/lib/hooks/legacyemitter.php @@ -0,0 +1,16 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OC\Hooks; + +abstract class LegacyEmitter extends BasicEmitter { + protected function emit($scope, $method, $arguments = array()) { + \OC_Hook::emit($scope, $method, $arguments); + parent::emit($scope, $method, $arguments); + } +} -- cgit v1.2.3 From 990f23c0249682043c9e0dd42f33c478e2aa9131 Mon Sep 17 00:00:00 2001 From: Robin Appelman Date: Thu, 9 May 2013 22:52:44 +0200 Subject: fix typo --- lib/hooks/basicemitter.php | 2 +- lib/hooks/emitter.php | 2 +- tests/lib/hooks/basicemitter.php | 18 +++++++++--------- 3 files changed, 11 insertions(+), 11 deletions(-) (limited to 'lib/hooks') diff --git a/lib/hooks/basicemitter.php b/lib/hooks/basicemitter.php index bd24539a40b..e615a58cfe8 100644 --- a/lib/hooks/basicemitter.php +++ b/lib/hooks/basicemitter.php @@ -35,7 +35,7 @@ abstract class BasicEmitter implements Emitter { * @param string $method optional * @param callable $callback optional */ - public function remoteListener($scope = null, $method = null, $callback = null) { + public function removeListener($scope = null, $method = null, $callback = null) { $names = array(); $allNames = array_keys($this->listeners); if ($scope and $method) { diff --git a/lib/hooks/emitter.php b/lib/hooks/emitter.php index 4219b6f3545..8e9074bad67 100644 --- a/lib/hooks/emitter.php +++ b/lib/hooks/emitter.php @@ -28,5 +28,5 @@ interface Emitter { * @param string $method optional * @param callable $callback optional */ - public function remoteListener($scope = null, $method = null, $callback = null); + public function removeListener($scope = null, $method = null, $callback = null); } diff --git a/tests/lib/hooks/basicemitter.php b/tests/lib/hooks/basicemitter.php index 53de996c5c9..f48dc53c563 100644 --- a/tests/lib/hooks/basicemitter.php +++ b/tests/lib/hooks/basicemitter.php @@ -153,7 +153,7 @@ class BasicEmitter extends \PHPUnit_Framework_TestCase { throw new EmittedException; }; $this->emitter->listen('Test', 'test', $listener); - $this->emitter->remoteListener('Test', 'test', $listener); + $this->emitter->removeListener('Test', 'test', $listener); $this->emitter->emitEvent('Test', 'test'); } @@ -166,7 +166,7 @@ class BasicEmitter extends \PHPUnit_Framework_TestCase { }; $this->emitter->listen('Test', 'test', $listener1); $this->emitter->listen('Test', 'test', $listener2); - $this->emitter->remoteListener('Test', 'test'); + $this->emitter->removeListener('Test', 'test'); $this->emitter->emitEvent('Test', 'test'); } @@ -176,7 +176,7 @@ class BasicEmitter extends \PHPUnit_Framework_TestCase { }; $this->emitter->listen('Test', 'test', $listener); $this->emitter->listen('Test', 'foo', $listener); - $this->emitter->remoteListener('Test', null, $listener); + $this->emitter->removeListener('Test', null, $listener); $this->emitter->emitEvent('Test', 'test'); $this->emitter->emitEvent('Test', 'foo'); } @@ -187,7 +187,7 @@ class BasicEmitter extends \PHPUnit_Framework_TestCase { }; $this->emitter->listen('Test', 'test', $listener); $this->emitter->listen('Bar', 'test', $listener); - $this->emitter->remoteListener(null, 'test', $listener); + $this->emitter->removeListener(null, 'test', $listener); $this->emitter->emitEvent('Test', 'test'); $this->emitter->emitEvent('Bar', 'test'); } @@ -199,7 +199,7 @@ class BasicEmitter extends \PHPUnit_Framework_TestCase { $this->emitter->listen('Test', 'test', $listener); $this->emitter->listen('Test', 'foo', $listener); $this->emitter->listen('Bar', 'foo', $listener); - $this->emitter->remoteListener(null, null, $listener); + $this->emitter->removeListener(null, null, $listener); $this->emitter->emitEvent('Test', 'test'); $this->emitter->emitEvent('Test', 'foo'); $this->emitter->emitEvent('Bar', 'foo'); @@ -217,7 +217,7 @@ class BasicEmitter extends \PHPUnit_Framework_TestCase { }; $this->emitter->listen('Test', 'test', $listener1); $this->emitter->listen('Test', 'test', $listener2); - $this->emitter->remoteListener('Test', 'test', $listener1); + $this->emitter->removeListener('Test', 'test', $listener1); $this->emitter->emitEvent('Test', 'test'); } @@ -230,7 +230,7 @@ class BasicEmitter extends \PHPUnit_Framework_TestCase { }; $this->emitter->listen('Test', 'test', $listener); $this->emitter->listen('Test', 'foo', $listener); - $this->emitter->remoteListener('Test', 'foo', $listener); + $this->emitter->removeListener('Test', 'foo', $listener); $this->emitter->emitEvent('Test', 'test'); } @@ -243,7 +243,7 @@ class BasicEmitter extends \PHPUnit_Framework_TestCase { }; $this->emitter->listen('Test', 'test', $listener); $this->emitter->listen('Bar', 'test', $listener); - $this->emitter->remoteListener('Bar', 'test', $listener); + $this->emitter->removeListener('Bar', 'test', $listener); $this->emitter->emitEvent('Test', 'test'); } @@ -255,7 +255,7 @@ class BasicEmitter extends \PHPUnit_Framework_TestCase { throw new EmittedException; }; $this->emitter->listen('Test', 'test', $listener); - $this->emitter->remoteListener('Bar', 'test', $listener); + $this->emitter->removeListener('Bar', 'test', $listener); $this->emitter->emitEvent('Test', 'test'); } } -- cgit v1.2.3