summaryrefslogtreecommitdiff
path: root/app/frontend/events/EventModule.php
diff options
context:
space:
mode:
Diffstat (limited to 'app/frontend/events/EventModule.php')
-rw-r--r--app/frontend/events/EventModule.php53
1 files changed, 53 insertions, 0 deletions
diff --git a/app/frontend/events/EventModule.php b/app/frontend/events/EventModule.php
new file mode 100644
index 0000000..6474523
--- /dev/null
+++ b/app/frontend/events/EventModule.php
@@ -0,0 +1,53 @@
+<?php
+
+class EventModule extends TModule {
+
+ public function init($config) {
+ $reflection = new ReflectionClass($this);
+ foreach ($reflection->getMethods() as $method) {
+ if (is_a($method->class, get_class(), TRUE)) {
+ $eventPattern = [];
+ if (preg_match('/^on(.*)/', $method->name, $eventPattern)) {
+ $this->_registerEventHandler(
+ $eventPattern[1],
+ $method->getClosure($this)
+ );
+ }
+ }
+ }
+ if (get_class() === get_called_class()) {
+ $directory = dirname(__FILE__);
+ foreach (scandir($directory) as $dirEntry) {
+ $classNameMatch = [];
+ if (preg_match('/(.*)\.php$/', $dirEntry, $classNameMatch)) {
+ $className = $classNameMatch[1];
+ include_once($directory . DIRECTORY_SEPARATOR . $dirEntry);
+ if ($className != get_class()
+ && is_a($className, get_class(), TRUE)) {
+ $class = new $className();
+ $class->init(NULL);
+ }
+ }
+ }
+ }
+ }
+
+ protected static $_handlers = [];
+ private function _registerEventHandler($event, $handler) {
+ if (!isset(self::$_handlers[$event])) {
+ self::$_handlers[$event] = [];
+ }
+ self::$_handlers[$event][] = $handler;
+ }
+
+ public function raiseApplicationEvent($event, ...$params) {
+ if (isset(self::$_handlers[$event])) {
+ foreach (self::$_handlers[$event] as $handler) {
+ call_user_func_array($handler, $params);
+ }
+ }
+ }
+
+}
+
+?>