@@ -44,22 +44,40 @@ def register_default(cls, handler: DerivedValueHandler) -> None:
4444 Args:
4545 handler: The derived value handler to register
4646 """
47- cls ._default_handlers [handler .function_name ] = handler
47+ normalized_name = handler .function_name .upper ()
48+ cls ._default_handlers [normalized_name ] = handler
49+
50+ if _RegistryHolder .instance is not None :
51+ _RegistryHolder .instance .register (handler )
52+
53+ def clear (self ) -> None :
54+ """Clear all handlers from this registry instance."""
55+ self ._handlers .clear ()
4856
4957 @classmethod
5058 def clear_defaults (cls ) -> None :
5159 """Clear all default handlers. Useful for testing."""
5260 cls ._default_handlers .clear ()
61+ if _RegistryHolder .instance is not None :
62+ _RegistryHolder .instance .clear ()
5363
5464 @classmethod
5565 def get_default_handlers (cls ) -> dict [str , DerivedValueHandler ]:
5666 """Get a copy of the default handlers. Useful for testing."""
5767 return cls ._default_handlers .copy ()
5868
69+ def set_handlers (self , handlers : dict [str , DerivedValueHandler ]) -> None :
70+ """Replace all handlers in this registry instance."""
71+ self ._handlers = {name .upper (): handler for name , handler in handlers .items ()}
72+
5973 @classmethod
6074 def set_default_handlers (cls , handlers : dict [str , DerivedValueHandler ]) -> None :
6175 """Set the default handlers. Useful for testing."""
62- cls ._default_handlers = handlers
76+ normalized = {name .upper (): handler for name , handler in handlers .items ()}
77+ cls ._default_handlers = normalized
78+
79+ if _RegistryHolder .instance is not None :
80+ _RegistryHolder .instance .set_handlers (handlers )
6381
6482 def register (self , handler : DerivedValueHandler ) -> None :
6583 """Register a derived value handler.
@@ -68,7 +86,8 @@ def register(self, handler: DerivedValueHandler) -> None:
6886 handler: The handler to register. Its function_name attribute
6987 will be used as the lookup key.
7088 """
71- self ._handlers [handler .function_name ] = handler
89+ normalized_name = handler .function_name .upper ()
90+ self ._handlers [normalized_name ] = handler
7291
7392 def get_handler (self , function_name : str ) -> DerivedValueHandler | None :
7493 """Get a handler by function name.
@@ -151,8 +170,10 @@ def calculate(
151170 return handler .calculate (context )
152171
153172
154- # Create a singleton instance for convenience
155- _registry = DerivedValueRegistry ()
173+ class _RegistryHolder :
174+ """Holder for the singleton registry to avoid global statement."""
175+
176+ instance : DerivedValueRegistry | None = None
156177
157178
158179def get_registry () -> DerivedValueRegistry :
@@ -161,4 +182,6 @@ def get_registry() -> DerivedValueRegistry:
161182 Returns:
162183 The singleton DerivedValueRegistry instance
163184 """
164- return _registry
185+ if _RegistryHolder .instance is None :
186+ _RegistryHolder .instance = DerivedValueRegistry ()
187+ return _RegistryHolder .instance
0 commit comments