module T::Props::Optional::DecoratorMethods

def add_prop_definition(prop, rules)

def add_prop_definition(prop, rules)
  rules[:fully_optional] = !T::Props::Utils.need_nil_write_check?(rules)
  super
end

def get_default(rules, instance_class)

def get_default(rules, instance_class)
  if rules.include?(:default)
    default = rules[:default]
    T::Props::Utils.deep_clone_object(default)
  elsif rules.include?(:factory)
    # Factory should never be nil if the key is specified, but
    # we do this rather than 'elsif rules[:factory]' for
    # consistency with :default.
    factory = rules[:factory]
    instance_class.class_exec(&factory)
  else
    nil
  end
end

def has_default?(rules)

def has_default?(rules)
  rules.include?(:default) || rules.include?(:factory)
end

def prop_optional?(prop); prop_rules(prop)[:fully_optional]; end

def prop_optional?(prop); prop_rules(prop)[:fully_optional]; end

def prop_validate_definition!(name, cls, rules, type)

def prop_validate_definition!(name, cls, rules, type)
  result = super
  if (rules_optional = rules[:optional])
    if !VALID_OPTIONAL_RULES.include?(rules_optional)
      raise ArgumentError.new(":optional must be one of #{VALID_OPTIONAL_RULES.inspect}")
    end
  end
  if rules.key?(:default) && rules.key?(:factory)
    raise ArgumentError.new("Setting both :default and :factory is invalid. See: go/chalk-docs")
  end
  result
end

def valid_props

def valid_props
  super + [
    :default,
    :factory,
    :optional,
  ]
end