@Override
  public boolean equals(Object o) {
    if (this == o) return true;

    if (o == null || getClass() != o.getClass()) return false;

    VersionImpl version = (VersionImpl) o;
    EqualsBuilder builder = new EqualsBuilder();
    int length = Math.max(numbers.length, version.numbers.length);
    VirtualNumberIterator thisIterator = new VirtualNumberIterator(numbers, length);
    VirtualNumberIterator otherIterator = new VirtualNumberIterator(version.numbers, length);
    while (thisIterator.hasNext() && builder.isEquals()) {
      builder.append(thisIterator.next(), otherIterator.next());
    }
    return builder.isEquals();
  }
 @Override
 public boolean less(Version otherVersion) {
   VersionImpl version = Assert.theSameClass(this, otherVersion, "otherVersion");
   int length = Math.max(numbers.length, version.numbers.length);
   VirtualNumberIterator thisIterator = new VirtualNumberIterator(numbers, length);
   VirtualNumberIterator otherIterator = new VirtualNumberIterator(version.numbers, length);
   while (thisIterator.hasNext()) {
     int n = thisIterator.next();
     int k = otherIterator.next();
     if (n != k) {
       return n < k;
     }
   }
   // It looks like versions are equals
   return false;
 }