int next() {
    current = end;
    if (current == DONE) {
      return DONE;
    }
    
    if (skipPossessive) {
      current += 2;
      skipPossessive = false;
    }

    int lastType = 0;
    
    while (current < endBounds && (isSubwordDelim(lastType = charType(text[current])))) {
      current++;
    }

    if (current >= endBounds) {
      return end = DONE;
    }
    
    for (end = current + 1; end < endBounds; end++) {
      int type = charType(text[end]);
      if (isBreak(lastType, type)) {
        break;
      }
      lastType = type;
    }
    
    if (end < endBounds - 1 && endsWithPossessive(end + 2)) {
      skipPossessive = true;
    }
    
    return end;
  }