class ActiveSupport::XMLConverter

def process_hash(value)

def process_hash(value)
  if value.include?('type') && !value['type'].is_a?(Hash) && @disallowed_types.include?(value['type'])
    raise DisallowedType, value['type']
  end
  if become_array?(value)
    _, entries = Array.wrap(value.detect { |k,v| not v.is_a?(String) })
    if entries.nil? || value['__content__'].try(:empty?)
      []
    else
      case entries
      when Array
        entries.collect { |v| deep_to_h(v) }
      when Hash
        [deep_to_h(entries)]
      else
        raise "can't typecast #{entries.inspect}"
      end
    end
  elsif become_content?(value)
    process_content(value)
  elsif become_empty_string?(value)
    ''
  elsif become_hash?(value)
    xml_value = Hash[value.map { |k,v| [k, deep_to_h(v)] }]
    # Turn { files: { file: #<StringIO> } } into { files: #<StringIO> } so it is compatible with
    # how multipart uploaded files from HTML appear
    xml_value['file'].is_a?(StringIO) ? xml_value['file'] : xml_value
  end
end