class Hash

def _deep_transform_values_in_object(object, &block)

support methods for deep transforming nested hashes and arrays
def _deep_transform_values_in_object(object, &block)
  case object
  when Hash
    object.transform_values { |value| _deep_transform_values_in_object(value, &block) }
  when Array
    object.map { |e| _deep_transform_values_in_object(e, &block) }
  else
    yield(object)
  end
end

def _deep_transform_values_in_object!(object, &block)

def _deep_transform_values_in_object!(object, &block)
  case object
  when Hash
    object.transform_values! { |value| _deep_transform_values_in_object!(value, &block) }
  when Array
    object.map! { |e| _deep_transform_values_in_object!(e, &block) }
  else
    yield(object)
  end
end

def deep_transform_values(&block)

# => {person: {name: "ROB", age: "28"}}
hash.deep_transform_values{ |value| value.to_s.upcase }

hash = { person: { name: 'Rob', age: '28' } }

nested hashes and arrays.
This includes the values from the root hash and from all
Returns a new hash with all values converted by the block operation.
def deep_transform_values(&block)
  _deep_transform_values_in_object(self, &block)
end

def deep_transform_values!(&block)

nested hashes and arrays.
This includes the values from the root hash and from all
Destructively converts all values by using the block operation.
def deep_transform_values!(&block)
  _deep_transform_values_in_object!(self, &block)
end