from __future__ import annotations
import functools
from typing import Callable
from .negotiator import Negotiator
__all__ = ["ControlledNegotiator"]
[docs]
class ControlledNegotiator(Negotiator):
"""
A negotiator that can be used to pass all method calls to a parent (Controller).
It uses magic dunder methods to implement a general way of passing calls to the parent. This method is slow.
It is recommended to implement a `ControlledNegotiator` for each mechanism that does this passing explicitly which
will be much faster.
For an example, see the implementation of `ControlledSAONegotiator` .
"""
def __getattribute__(self, item):
if item in (
"id",
"name",
"on_preferences_changed",
"has_preferences",
"preferences",
"ufun",
"opponent_ufun",
"reserved_value",
"nmi",
"ami",
"owner",
"annotation",
"private_info",
"parent",
"capabilities",
) or item.startswith("_"):
return super().__getattribute__(item)
parent = super().__getattribute__("__dict__").get("_Negotiator__parent", None)
if parent is None:
return super().__getattribute__(item)
attr = getattr(parent, item, None)
if attr is None:
return super().__getattribute__(item)
if isinstance(attr, Callable):
return functools.partial(
attr,
negotiator_id=super().__getattribute__("__dict__")[
"_NamedObject__uuid"
],
)
return super().__getattribute__(item)