class Tins::StringVersion::Version

def <=>(other)

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

def ==(other)

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

def [](index)

def [](index)
  array[index]
end

def []=(index, value)

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

def array

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

def build

def build
  self[2]
end

def build=(number)

def build=(number)
  self[2] = number
end

def initialize(string)

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

def major

def major
  self[0]
end

def major=(number)

def major=(number)
  self[0] = number
end

def minor

def minor
  self[1]
end

def minor=(number)

def minor=(number)
  self[1] = number
end

def pred!

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

def revision

def revision
  self[3]
end

def revision=(number)

def revision=(number)
  self[3] = number
end

def succ!

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

def to_s

def to_s
  @version
end

def version

def version
  self
end