sclass Fragment { S text; // should not be null like ever transient int hashCode; *() {} *(S text) { this.text = trim(text); } toString { ret text == null ? "null fragment you bunny" : text; } public int hashCode() { if (hashCode == 0) hashCode = main hashCode(upper(text)); ret hashCode; } // Note: we have the "turkish" problem (upper <-> eqic) public bool equals(O o) { // we could allow string here too but that's nasty if (!o instanceof Fragment) false; ret eqic(text, o/Fragment.text); } }