concept UserName { S name; bool usable; } concept Line { S text; new Ref idea; *() {} *(S *text) { change(); } } concept UserLine extends Line { *() {} *(S text) { super(text); } } concept BotLine extends Line { *() {} *(S text, LineIdea idea) { super(text); this.idea.set(idea); } } concept LineIdea {} concept LError extends LineIdea { S stackTrace; *() {} *(Throwable e) { stackTrace = getStackTrace(e); change(); } } concept LGreet extends LineIdea { new Ref userName; *() {} *(UserName u) { userName.set(u); } } concept LWhatsYourName extends LineIdea {} concept LIDontUnderstand extends LineIdea {} concept Dialog { new RefL lines; } static Dialog dialog() { ret unique(Dialog); }