summaryrefslogtreecommitdiff
path: root/src/Hook.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/Hook.php')
-rw-r--r--src/Hook.php70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/Hook.php b/src/Hook.php
new file mode 100644
index 0000000..0b292ce
--- /dev/null
+++ b/src/Hook.php
@@ -0,0 +1,70 @@
+<?php
+
+namespace ERPHP;
+
+class Hook
+{
+ /**
+ * @var array<string, array<int, callable[]>> $actions
+ */
+ private static array $actions;
+
+ /**
+ * @var array<string, array<int, callable[]>> $filters
+ */
+ private static array $filters;
+
+ /**
+ * @param string $name
+ * @param callable $function
+ */
+ public static function addAction(string $name, callable $function, int $priority = 10): void
+ {
+ self::$actions[$name][$priority][] = $function;
+ }
+
+ /**
+ * @param string $name
+ * @param array $parameters
+ */
+ public static function runAction(string $name, ...$parameters): void
+ {
+ $actions = self::$actions[$name] ?? [];
+
+ foreach ($actions as $priority => $functions) {
+ foreach ($functions as $function) {
+ call_user_func_array($function, $parameters);
+ }
+ }
+ }
+
+ /**
+ * @param string $name
+ * @param callable $function
+ */
+ public static function addFilter(string $name, callable $function, int $priority = 10): void
+ {
+ self::$filters[$name][$priority][] = $function;
+ }
+
+ /**
+ * @param string $name
+ * @param mixed $value
+ * @param array $parameters
+ *
+ * @return mixed
+ */
+ public static function applyFilter(string $name, mixed $value, ...$parameters): mixed
+ {
+ $filteredValue = $value;
+ $filters = self::$filters[$name] ?? [];
+
+ foreach ($filters as $priority => $functions) {
+ foreach ($functions as $function) {
+ $filteredValue = call_user_func_array($function, [$value, ...$parameters]);
+ }
+ }
+
+ return $filteredValue;
+ }
+}