module Gapic::Config

def create_setter name_ivar, name_setter, default, validator

def create_setter name_ivar, name_setter, default, validator
  define_method name_setter do |new_value|
    valid_value = validator.call new_value
    if new_value.nil?
      # Always allow nil when a default value is present
      valid_value ||= !default.nil?
      valid_value ||= begin
        # Allow nil if parent config has the getter method.
        parent = instance_variable_get :@parent_config if instance_variable_defined? :@parent_config
        parent&.respond_to? name_setter
      end
    end
    raise ArgumentError unless valid_value
    if new_value.nil?
      remove_instance_variable name_ivar if instance_variable_defined? name_ivar
    else
      instance_variable_set name_ivar, new_value
    end
  end
end