import inspect


def get_methods_defined_in_class(cls):
    """
    Get all functions defined in a given class. This includes all
    non-inherited methods, static methods and class methods.

    Args:
        cls (Type): Class for lookup

    Returns:
        List[Tuple[str, Union[FunctionType, MethodType]]]
    """
    methods = inspect.getmembers(cls, inspect.isfunction)
    class_methods = inspect.getmembers(cls, inspect.ismethod)

    functions = methods + class_methods

    # Only keep non-inherited functions
    cls_symbols = cls.__dict__
    functions = [f for f in functions if f[0] in cls_symbols]

    return functions