from abc import ABC, abstractmethod from typing import Callable, Generic, TypeVar T = TypeVar("T") class ObjectSerializerBase(ABC, Generic[T]): """Saves and loads arbitrary python objects.""" def __init__(self) -> None: self._on_deleted_callbacks: list[Callable[[str], None]] = [] @abstractmethod def load(self, name: str) -> T: """ Loads the object. :param name: The name of the object to load. :raises ObjectNotFoundError: if the object is not found """ pass @abstractmethod def save(self, obj: T) -> str: """ Saves the object, returning its name. :param obj: The object to save. """ pass @abstractmethod def delete(self, name: str) -> None: """ Deletes the object, if it exists. :param name: The name of the object to delete. """ pass def on_deleted(self, on_deleted: Callable[[str], None]) -> None: """Register a callback for when an object is deleted""" self._on_deleted_callbacks.append(on_deleted) def _on_deleted(self, name: str) -> None: for callback in self._on_deleted_callbacks: callback(name)