from __future__ import annotations

from typing import Any, TypeVar

from gi.repository import GObject

from . import Ref

__all__ = ["GRef"]

T = TypeVar("T")


class GRef(Ref[T]):
    _prop_name: str
    _gobject: GObject.Object

    def __init__(self, gobj: GObject.Object, prop_name: str):
        super().__init__(gobj.get_property(prop_name))
        self._prop_name = prop_name
        gobj.connect(f"notify::{prop_name}", self._on_notify)

    def _on_notify(self, *args: Any):
        self.value = self._gobject.get_property(self._prop_name)

    def __repr__(self):
        return f"GRef(gobj={self._gobject!r}, prop_name={self._prop_name!r})"