*/ private static array $abilities = []; /** @var array alias => current name */ private static array $aliases = []; /** @var array ability name => what shows its staged value on the preview */ private static array $renders = []; /** @param array $aliases */ public static function addAbility(Ability $ability, array $aliases, ?\Closure $render = null): bool { if (isset(self::$abilities[$ability->name]) || isset(self::$aliases[$ability->name])) { return false; } foreach ($aliases as $alias) { if (isset(self::$abilities[$alias]) || isset(self::$aliases[$alias])) { return false; } } self::$abilities[$ability->name] = $ability; if ($render !== null) { self::$renders[$ability->name] = $render; } foreach ($aliases as $alias) { self::$aliases[$alias] = $ability->name; } return true; } /** @return array */ public static function abilities(): array { return array_values(self::$abilities); } /** The current name an earlier ability name now answers to, if any. */ public static function aliasFor(string $name): ?string { return self::$aliases[$name] ?? null; } /** * Hands each extension ability what it staged on the preview being shown. * A render that fails leaves the page as WordPress holds it. * * @param array $staged ability name => staged value */ public static function render(array $staged): void { foreach ($staged as $name => $value) { $render = self::$renders[$name] ?? self::$renders[self::$aliases[$name] ?? ''] ?? null; if ($render === null) { continue; } try { $render($value); } catch (\Throwable) { continue; } } } public static function reset(): void { self::$abilities = []; self::$aliases = []; self::$renders = []; } }