class Geminabox::GemVersionCollection

def <<(version_or_def)

def <<(version_or_def)
  version = if version_or_def.is_a?(Geminabox::GemVersion)
              version_or_def
            else
              Geminabox::GemVersion.new(*version_or_def)
            end
  @gems << version
  @gems.sort!
end

def by_name

def by_name
  grouped = @gems.inject(hash_of_collections) do |grouped, gem|
    grouped[gem.name] << gem
    grouped
  end.sort_by{|name, gems| name.downcase }
  if block_given?
    grouped.each(&Proc.new)
  else
    grouped
  end
end

def each(&block)

def each(&block)
  @gems.each(&block)
end

def hash_of_collections

def hash_of_collections
  Hash.new { |h,k| h[k] = self.class.new }
end

def initialize(initial_gems=[])

def initialize(initial_gems=[])
  @gems = []
  initial_gems.each { |gemdef| self << gemdef }
end

def newest

def newest
  @gems.last
end

def oldest

def oldest
  @gems.first
end

def |(other)

def |(other)
  self.class.new(self.gems | other.gems)
end