hooks[$path] ??= []; $this->hooks[$path][] = $callback; return $this; } public function run(string $path, ...$arguments) : self { if ( $this->hooks[$path] ?? false ) { while ( $callback = array_pop($this->hooks[$path]) ) { $callback(...$arguments); } } } public function renderUses() : string { return implode(",", $this->useStack ?? []); } public function renderFunctions() : string { if ($this->extendFrom) { return "parent::exportFunctions();"; } else { $cls = $this->compiledClassPath(); $ns = $this->namespace ? "\\{$this->namespace}\\" : ""; $list = ['static $caching = [];']; foreach ($this->functionStack as $name => $function) { $list[] = <<functionStack['$name'](...\$arguments); } } FUNC; } return implode(PHP_EOL, $list); } } public function exportFunctions() : void { } public function pushFunction($name, Callable $callable) : void { $this->functionStack[$name] = $callable; } public function compiledClassPath() : string { if ($this->namespace) { return "\\{$this->namespace}\\{$this->className}"; } return $this->className; } public function cacheFilename() : string { return strtolower(str_replace("\\", DIRECTORY_SEPARATOR, $this->namespace)) . ".context"; } }