class BridgeException(Exception): def __init__(self, id: str, type: str, message: str) -> None: super().__init__(f"Bridge [{type} | {id}] has thrown an exception: {message}") class Bridge: def __init__(self, *, id: str, type: str) -> None: self._id = id self._type = type @property def id(self) -> str: return self._id @property def type(self) -> str: return self._type @property def is_connected(self) -> bool | None: return None def __del__(self) -> None: self.disconnect() def connect(self) -> None: pass def disconnect(self) -> None: pass def requires_connection(func, *, auto_connect=True): def inner(self: Bridge, *args, **kwargs): if self.is_connected is False: # Neither True, nor None if not auto_connect: raise BridgeException( self.id, self.type, f"Bridge must be manually connected before executing method [{func.__name__}].", ) self.connect() return func(*args, **kwargs) return inner