module T::Private::Methods::CallValidation

def self.create_validator_method_fast4(mod, original_method, method_sig, return_type, arg0_type, arg1_type, arg2_type, arg3_type)

def self.create_validator_method_fast4(mod, original_method, method_sig, return_type, arg0_type, arg1_type, arg2_type, arg3_type)
  mod.send(:define_method, method_sig.method_name) do |arg0, arg1, arg2, arg3, &blk|
    # This method is a manually sped-up version of more general code in `validate_call`
    unless arg0.is_a?(arg0_type)
      CallValidation.report_error(
        method_sig,
        method_sig.arg_types[0][1].error_message_for_obj(arg0),
        'Parameter',
        method_sig.arg_types[0][0],
        arg0_type,
        arg0,
        caller_offset: -1
      )
    end
    unless arg1.is_a?(arg1_type)
      CallValidation.report_error(
        method_sig,
        method_sig.arg_types[1][1].error_message_for_obj(arg1),
        'Parameter',
        method_sig.arg_types[1][0],
        arg1_type,
        arg1,
        caller_offset: -1
      )
    end
    unless arg2.is_a?(arg2_type)
      CallValidation.report_error(
        method_sig,
        method_sig.arg_types[2][1].error_message_for_obj(arg2),
        'Parameter',
        method_sig.arg_types[2][0],
        arg2_type,
        arg2,
        caller_offset: -1
      )
    end
    unless arg3.is_a?(arg3_type)
      CallValidation.report_error(
        method_sig,
        method_sig.arg_types[3][1].error_message_for_obj(arg3),
        'Parameter',
        method_sig.arg_types[3][0],
        arg3_type,
        arg3,
        caller_offset: -1
      )
    end
    # The following line breaks are intentional to show nice pry message
    # PRY note:
    # this code is sig validation code.
    # Please issue `finish` to step out of it
    return_value = original_method.bind(self).call(arg0, arg1, arg2, arg3, &blk)
    unless return_value.is_a?(return_type)
      message = method_sig.return_type.error_message_for_obj(return_value)
      if message
        CallValidation.report_error(
          method_sig,
          message,
          'Return value',
          nil,
          method_sig.return_type,
          return_value,
          caller_offset: -1
        )
      end
    end
    return_value
  end
end