class XSemVer::SemVer

def initialize major=0, minor=0, patch=0, special='', metadata=''

def initialize major=0, minor=0, patch=0, special='', metadata=''
  major.kind_of? Integer or raise "invalid major: #{major}"
  minor.kind_of? Integer or raise "invalid minor: #{minor}"
  patch.kind_of? Integer or raise "invalid patch: #{patch}"
  unless special.empty?
    special =~ /[A-Za-z][0-9A-Za-z\.]+/ or raise "invalid special: #{special}"
  end
  unless metadata.empty?
    metadata =~ /\A[A-Za-z0-9][0-9A-Za-z\.-]*\z/ or raise "invalid metadata: #{metadata}"
  end
  @major, @minor, @patch, @special, @metadata = major, minor, patch, special, metadata
end