class Tins::StringVersion::Version

def <=>(other)

def <=>(other)
  pairs = array.zip(other.array)
  pairs.map! { |a, b| [ a.to_i, b.to_i ] }
  a, b = pairs.transpose
  a <=> b
end

def ==(other)

def ==(other)
  (self <=> other).zero?
end

def [](level)

def [](level)
  array[level_of(level)]
end

def []=(level, value)

def []=(level, value)
  level = level_of(level)
  value = value.to_i
  value >= 0 or raise ArgumentError,
    "version numbers can't contain negative numbers like #{value}"
  a = array
  a[level] = value
  a.map!(&:to_i)
  @version.replace a * ?.
end

def array

def array
  @version.split(?.).map(&:to_i)
end

def bump(level = array.size - 1)

def bump(level = array.size - 1)
  level = level_of(level)
  self[level] += 1
  for l in level.succ..3
    self[l] &&= 0
  end
  self
end

def initialize(string)

def initialize(string)
  string =~ /\A\d+(\.\d+)*\z/ or
    raise ArgumentError, "#{string.inspect} isn't a version number"
  @version = string.frozen? ? string.dup : string
end

def initialize_copy(source)

def initialize_copy(source)
  super
  @version = source.instance_variable_get(:@version).dup
end

def level_of(specifier)

def level_of(specifier)
  if specifier.respond_to?(:to_sym)
    LEVELS.fetch(specifier)
  else
    specifier
  end
end

def pred!

def pred!
  self[-1] -= 1
  self
end

def succ!

def succ!
  self[-1] += 1
  self
end

def to_s

def to_s
  @version
end