diff options
Diffstat (limited to 'src/Hook.php')
| -rw-r--r-- | src/Hook.php | 70 |
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; + } +} |
