diff --git a/langex/classes/singleton.py b/langex/classes/singleton.py index 45ba600..bf0adbe 100644 --- a/langex/classes/singleton.py +++ b/langex/classes/singleton.py @@ -1,17 +1,17 @@ -class Singleton: - def __init__(self, cls): - self.cls = cls - self.instance = None +from langex.classes.class_meta import ClassMeta - def __call__(self, *args, **kwargs): - if self.instance is None: - self.instance = self.cls(*args, **kwargs) +def Singleton(cls): + instance = ClassMeta(cls).use_primitive()() - return self.instance + class Wrapper(): + def __call__(self): + return instance - def __getattr__(self, name): - if self.instance is None: - self.instance = self.cls() + def __getattr__(self, name): + return getattr(instance, name) - return getattr(self.instance, name) + def __setattr__(self, name, value): + return setattr(instance, name, value) + + return Wrapper() diff --git a/langex/functions/function_meta.py b/langex/functions/function_meta.py index 38263ff..b3f2d45 100644 --- a/langex/functions/function_meta.py +++ b/langex/functions/function_meta.py @@ -32,12 +32,22 @@ def __init__(self, func): self.bounded = self.check_class_bound() self.signature = Signature(self.qual) self.is_abstract = False + self._inject_mimic(func) self._inject() def _inject(self): setattr(self, LANGEX.MARKER, True) setattr(self, LANGEX.FUNC_META, self) + def _inject_mimic(self, func): + self.__code__ = self.func.__code__ + self.__defaults__ = self.func.__defaults__ + self.__kwdefaults__ = self.func.__kwdefaults__ + self.__annotations__ = self.func.__annotations__ + self.__doc__ = self.func.__doc__ + self.__qualname__ = self.func.__qualname__ + self.__name__ = self.func.__name__ + def check_class_bound(self): parts = self.qual.split(".") diff --git a/tests/classes/test_singleton.py b/tests/classes/test_singleton.py index 17b27d2..3cb3ee2 100644 --- a/tests/classes/test_singleton.py +++ b/tests/classes/test_singleton.py @@ -1,4 +1,6 @@ from langex.core.classes import singleton +from langex.core.errors import ValidationError +from langex.core.functions import autosig from langex.core.testing import discover_test, expects @singleton @@ -11,12 +13,18 @@ def next_id(self): return self.value + @autosig + def next_id_with_prefix(self, prefix: str) -> str: + return f"{prefix}_{self.next_id()}" + @discover_test def test_singleton(): id_gen1 = IdGenerator() id_gen2 = IdGenerator() - (id_gen1.next_id ) @expects (1) - (id_gen1.next_id ) @expects (2) - (id_gen2.next_id ) @expects (3) - (lambda: id_gen1 is id_gen2) @expects (True) + (id_gen1.next_id ) @expects (1) + (id_gen1.next_id ) @expects (2) + (id_gen2.next_id ) @expects (3) + (lambda: id_gen1 is id_gen2 ) @expects (True) + (lambda: id_gen1.next_id_with_prefix(0) ) @expects (ValidationError) + (lambda: id_gen1.next_id_with_prefix("ID")) @expects ("ID_4")