!7 concept AList { S name, comment; Int length; // if known long lastChanged; // All other fields are dynamic (in fieldValues). } sclass ListMaker > DynCRUD { bool voiceMode = true; *() { super(AList); } start { dm_onTopInput(voidfunc(S s) { if (voiceMode) reactToInput(s) }); } void reactToInput(fS s) { switch to dm_q(); if (matchEnd_vbar("new list", s)) addDialog(); } void addDialog enter { inputText("Name for new list", voidfunc(S name) { or(s, "A list made on " + ymd_hms()); cnew(AList, +name, lastChanged := now()); }); } visualize { ret northAndCenter( withMargin(dm_fieldCheckBox('voiceMode)), super.visualize()); } }