sclass Tok {
  // either one can be null (bot not both)
  S s;    // joined
  LS tok; // tokenized
  
  ITokenizer tokenizer; // optional
  
  *() {}
  *(LS *tok) {}
  
  // a lambdaMapLike constructor - that's new
  // use like: Tok javaTok("bla")
  lambdaMapLike Tok(ITokenizer tokenizer, S s) {
    this.tokenizer = tokenizer;
    this.s = s;
  }
  
  S text() {
    if (s == null) s = join(tok);
    ret s;
  }
  
  LS tok() {
    if (tok == null) tok = tokenizer.tokenize(s);
    ret tok;
  }
  
  // Note: toString can trigger tokenization
  toString { ret appendSquareBracketed(text(), nTokens(countTokens(tok()))); }
}