class ReeHash::Except

def call(hash, keys = [], **opts)

def call(hash, keys = [], **opts)
  keys = build_filter_keys(keys)
  global_except_keys = build_filter_keys(opts[:global_except] || [])
  recursively_except(hash, keys, global_except_keys)
end

def recursively_except(hash, except_keys, global_except_keys)

def recursively_except(hash, except_keys, global_except_keys)
  result = {}
  except_keys ||= {}
  result.default = hash.default
  result.default_proc = hash.default_proc if hash.default_proc
  hash.each do |k, v|
    next if global_except_keys.has_key?(k)
    next if except_keys.has_key?(k) && except_keys[k].empty?
    if v.is_a?(Array)
      result[k] = v.map do |item|
        if item.is_a?(Hash)
          recursively_except(item, except_keys[k], global_except_keys)
        else
          item
        end
      end
    elsif v.is_a?(Hash)
      result[k] = recursively_except(
        v, except_keys[k], global_except_keys
      )
    else
      result[k] = v
    end
  end
  result
end