module T::Props::Optional::DecoratorMethods

def add_prop_definition(prop, rules)

def add_prop_definition(prop, rules)
  compute_derived_rules(rules)
  default_setter = T::Props::Private::ApplyDefault.for(decorated_class, rules)
  if default_setter
    @props_with_defaults ||= {}
    @props_with_defaults[prop] = default_setter
    @props_without_defaults&.delete(prop) # Handle potential override
    rules[DEFAULT_SETTER_RULE_KEY] = default_setter
  else
    @props_without_defaults ||= {}
    @props_without_defaults[prop] = rules.fetch(:setter_proc)
    @props_with_defaults&.delete(prop) # Handle potential override
  end
  super
end

def compute_derived_rules(rules)

def compute_derived_rules(rules)
  rules[:fully_optional] = !T::Props::Utils.need_nil_write_check?(rules)
  rules[:need_nil_read_check] = T::Props::Utils.need_nil_read_check?(rules)
end

def get_default(rules, instance_class)

def get_default(rules, instance_class)
  rules[DEFAULT_SETTER_RULE_KEY]&.default
end

def has_default?(rules)

def has_default?(rules)
  rules.include?(DEFAULT_SETTER_RULE_KEY)
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.key?(:default) && rules.key?(:factory)
    raise ArgumentError.new("Setting both :default and :factory is invalid. See: go/chalk-docs")
  end
  result
end

def valid_rule_key?(key)

def valid_rule_key?(key)
  super || VALID_RULE_KEYS[key]
end