from ralium.util import ClassType
from typing import AnyStr, Tuple, Dict, Any
from types import FunctionType

class FunctionArgumentInfo:
    def __init__(self, 
        cls: ClassType, 
        function: FunctionType, 
        result: Any | None = ..., 
        *args: Tuple[Any], 
        **kwargs: Dict[str, Any]
    ) -> Any: ...
    
    def __repr__(self) -> AnyStr: ...

class BroadcastFunction:
    def __init__(self) -> None: ...
    def __call__(self, *args: Tuple[Any], **kwargs: Dict[str, Any]) -> None: ...

    def subscribe(self, function: FunctionType, is_after: bool = False) -> None: ...
    def unsubscribe(self, function: FunctionType, is_after: bool = False) -> None: ...

class ClassListener:
    def __init__(self, cls: ClassType) -> None: ...
    def __call__(self, *args: Tuple[Any], **kwargs: Dict[str, Any]) -> ClassType: ...
    def create_listener(self, function: FunctionType) -> BroadcastFunction: ...