# SPDX-License-Identifier: GPLv3-or-later
# Copyright © 2025 pygaindalf Rui Pinheiro
from typing import Any, Self, final, override
from pydantic import BaseModel, PrivateAttr
from ..callguard import callguard_class
[docs]
@callguard_class(ignore_patterns=("_SingleInitializationModel__initialized"))
class SingleInitializationModel(BaseModel):
__initialized: bool = PrivateAttr(default=False)
[docs]
def __new__(cls, *args, **kwargs) -> Self:
instance = super().__new__(cls)
instance.__initialized = False
return instance
[docs]
def __init__(self, *args, **kwargs) -> None:
if self.initialized:
msg = f"Model {self} is already initialized."
raise RuntimeError(msg)
super().__init__(*args, **kwargs)
self.__initialized = True
[docs]
@override
def model_post_init(self, context: Any) -> None:
super().model_post_init(context)
@final
@property
def initialized(self) -> bool:
return self.__initialized