module T::Props::Serializable::DecoratorMethods

def add_prop_definition(prop, rules)

def add_prop_definition(prop, rules)
  rules[:serialized_form] = rules.fetch(:name, prop.to_s)
  res = super
  prop_by_serialized_forms[rules[:serialized_form]] = prop
  res
end

def extra_props(instance)

def extra_props(instance)
  instance.instance_variable_get(:@_extra_props) || EMPTY_EXTRA_PROPS
end

def from_hash(hash, strict=false)

def from_hash(hash, strict=false)
  raise ArgumentError.new("#{hash.inspect} provided to from_hash") if !(hash && hash.is_a?(Hash))
  i = @class.allocate
  i.deserialize(hash, strict)
  i
end

def get_id(instance)

def get_id(instance)
  prop = prop_by_serialized_forms['_id']
  if prop
    get(instance, prop)
  else
    nil
  end
end

def inspect_instance_components(instance, multiline:, indent:)

@override T::Props::PrettyPrintable
def inspect_instance_components(instance, multiline:, indent:)
tra_props = extra_props(instance)) && !extra_props.empty?
ty_kvs = extra_props.map {|k, v| [k.to_sym, v.inspect]}
a = join_props_with_pretty_values(pretty_kvs, multiline: false)
r + ["@_extra_props=<#{extra}>"]
r

def prop_by_serialized_forms; @class.prop_by_serialized_forms; end

def prop_by_serialized_forms; @class.prop_by_serialized_forms; end

def prop_dont_store?(prop); prop_rules(prop)[:dont_store]; end

def prop_dont_store?(prop); prop_rules(prop)[:dont_store]; end

def prop_serialized_form(prop)

def prop_serialized_form(prop)
  prop_rules(prop)[:serialized_form]
end

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

def prop_validate_definition!(name, cls, rules, type)
  result = super
  if (rules_name = rules[:name])
    unless rules_name.is_a?(String)
      raise ArgumentError.new("Invalid name in prop #{@class.name}.#{name}: #{rules_name.inspect}")
    end
    validate_prop_name(rules_name)
  end
  if !rules[:raise_on_nil_write].nil? && rules[:raise_on_nil_write] != true
      raise ArgumentError.new("The value of `raise_on_nil_write` if specified must be `true` (given: #{rules[:raise_on_nil_write]}).")
  end
  result
end

def required_props

def required_props
  @class.props.select {|_, v| T::Props::Utils.required_prop?(v)}.keys
end

def serialized_form_prop(serialized_form)

def serialized_form_prop(serialized_form)
  prop_by_serialized_forms[serialized_form.to_s] || raise("No such serialized form: #{serialized_form.inspect}")
end

def valid_rule_key?(key)

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