def METHOD_NAME(self, node):
    num_args = len(self._inputs)  # the number of args the signature indicates
    expect_num_args = num_args
    if self._has_varargs:
        # note special meaning for -1 in validate_call_args API
        expect_num_args = (num_args, -1)
    validate_call_args(node, expect_num_args, self._kwargs)
    for arg, (_, expected) in zip(node.args, self._inputs):
        self._validate_single(arg, expected)
    for kwarg in node.keywords:
        kwarg_settings = self._kwargs[kwarg.arg]
        if kwarg_settings.require_literal and not isinstance(kwarg.value, vy_ast.Constant):
            raise TypeMismatch("Value for kwarg must be a literal", kwarg.value)
        self._validate_single(kwarg.value, kwarg_settings.typ)
    # typecheck varargs. we don't have type info from the signature,
    # so ensure that the types of the args can be inferred exactly.
    varargs = node.args[num_args:]
    if len(varargs) > 0:
        assert self._has_varargs  # double check validate_call_args
    for arg in varargs:
        # call get_exact_type_from_node for its side effects -
        # ensures the type can be inferred exactly.
        get_exact_type_from_node(arg)