class Hash

def transform_keys_with_hash_arg!(hash = not_given = true, &block)

def transform_keys_with_hash_arg!(hash = not_given = true, &block)
  return enum_for(:transform_keys!) { size } if not_given && !block
  return transform_keys_without_hash_arg!(&block) if not_given
  h = {}
  begin
    if block_given?
      each do |key, value|
        h[hash.fetch(key) { yield key }] = value
      end
    else
      each do |key, value|
        h[hash.fetch(key, key)] = value
      end
    end
  ensure
    replace(h)
  end
  self
end