from __future__ import annotations from dataclasses import dataclass, field from typing import Any class ServiceRegistry: def __init__(self) -> None: self._services: dict[str, Any] = {} def provide(self, name: str, service: Any) -> None: if not name: raise ValueError("service name must not be empty") self._services[name] = service def get(self, name: str, default: Any = None) -> Any: return self._services.get(name, default) def require(self, name: str) -> Any: if name not in self._services: raise KeyError(f"service not provided: {name}") return self._services[name] def has(self, name: str) -> bool: return name in self._services def names(self) -> tuple[str, ...]: return tuple(self._services) @dataclass class Context: services: ServiceRegistry = field(default_factory=ServiceRegistry) def provide(self, name: str, service: Any) -> None: self.services.provide(name, service) def get(self, name: str, default: Any = None) -> Any: return self.services.get(name, default) def require(self, name: str) -> Any: return self.services.require(name)