Calls a callback with optional args and keyword args lists. This method exists so
    we can inspect the `_max_calls` attribute that's set by `_on`. If this value is None,
    the callback is considered to have no limit. Otherwise, an integer value is expected
    and decremented until there are no remaining calls

def _call(callback, args=[], kwargs={}):
    """
    Calls a callback with optional args and keyword args lists. This method exists so
    we can inspect the `_max_calls` attribute that's set by `_on`. If this value is None,
    the callback is considered to have no limit. Otherwise, an integer value is expected
    and decremented until there are no remaining calls
    """
    if not hasattr(callback, '_max_calls'):
        callback._max_calls = None

    # None implies no callback limit
    if callback._max_calls is None:
        return _call_partial(callback, *args, **kwargs)

    # Should the signal be disconnected?
    if callback._max_calls <= 0:
        return disconnect(callback)

    callback._max_calls -= 1

    return _call_partial(callback, *args, **kwargs)