$grammar) { yield $scopeName => $grammar; } } public static function has(string $scopeName): bool { return (array_key_exists($scopeName, self::$storage)); } public static function keys(): \Traversable { foreach (self::$storage as $scopeName => $_) { yield $scopeName; } } public static function set(string $scopeName, Grammar $grammar): bool { try { self::$storage[$scopeName] = $grammar; } catch (\Exception $e) { return false; } return true; } public function values(): \Traversable { foreach (self::$storage as $grammar) { yield $grammar; } } }