# File lib/hashery/core_ext.rb, line 58
  def rekey(key_map=nil, &block)
    if !(key_map or block)
      block = lambda{|k| k.to_sym}
    end

    key_map ||= {} 

    hash = {}

    (keys - key_map.keys).each do |key|
      hash[key] = self[key]
    end

    key_map.each do |from, to|
      hash[to] = self[from] if key?(from)
    end

    hash2 = {}

    if block
      case block.arity
      when 0
        raise ArgumentError, "arity of 0 for #{block.inspect}"
      when 2
        hash.each do |k,v|
          nk = block.call(k,v)
          hash2[nk] = v
        end
      else
        hash.each do |k,v|
          nk = block[k]
          hash2[nk] = v
        end
      end
    else
      hash2 = hash
    end

    hash2
  end