"""Lazily-built shared services handed to every module via ModuleContext. Astal's GObject service libraries (AstalNetwork, AstalBluetooth) are consumed here through GObject-introspection; modules connect to their `notify::` signals instead of polling. The location service is our own singleton. """ from __future__ import annotations import gi gi.require_version("AstalNetwork", "0.1") gi.require_version("AstalBluetooth", "0.1") from gi.repository import AstalBluetooth, AstalNetwork # noqa: E402 from services.location import get_location_service class Services: def __init__(self) -> None: self._network = None self._bluetooth = None self.location = get_location_service() @property def network(self): if self._network is None: self._network = AstalNetwork.Network.get_default() return self._network @property def bluetooth(self): if self._bluetooth is None: self._bluetooth = AstalBluetooth.Bluetooth.get_default() return self._bluetooth