def where(filter)
      return self if filter.nil?
      select do |item|
        matches = true
        filter.each do |key, value|
          matches &= case value
                     when Regexp
                       item.send(key) =~ value
                     else
                       item.send(key) == value
                     end
        end
        matches
      end
    end
def where(filter)
      return self if filter.nil?
      select do |item|
        matches = true
        filter.each do |key, value|
          matches &= case value
                     when Regexp
                       item.send(key) =~ value
                     else
                       item.send(key) == value
                     end
        end
        matches
      end
    end
Filters an array of objects by a given hash. The keys of
 the hash must be methods implemented by the objects. The
 values of the hash are compared to the values the object
 returns when calling the methods.

 @param filter [Hash] the filters that should be applied
 @return [Array] the filtered array.