static final class BetterStringBuffer implements CharSequence, Appendable { new StringBuilder builder; long changes; L onChange; public synchronized Appendable append(char c) { builder.append(c); ret change(); } public synchronized Appendable append(CharSequence csq, int start, int end) { builder.append(csq, start, end); ret change(); } public synchronized Appendable append(CharSequence csq) { builder.append(csq); ret change(); } BetterStringBuffer change() { ++changes; pcallFAll(onChange); this; } toString { ret str(builder); } }