class Hash
  
  def symbolize_keys
    transform_keys{ |key| key.to_sym rescue key }
  end
  
  def transform_keys
    result = {}
    each_key do |key|
      result[yield(key)] = self[key]
    end
    result
  end
  
  def deep_symbolize_keys
    deep_transform_keys{ |key| key.to_sym rescue key }
  end
  
  def deep_transform_keys(&block)
    result = {}
    each do |key, value|
      result[yield(key)] = value.is_a?(Hash) ? value.deep_transform_keys(&block) : value
    end
    result
  end
  
end