!7 concept Cmd { S patterns; // for mmo_parsePattern S cmd; // a pattern recognized by #1027443 int index; transient MMOPattern parsedPattern; void change { parsedPattern = null; super.change(); } MMOPattern parsedPattern() { if (parsedPattern == null) parsedPattern = mmo_parsePattern(patterns); ret parsedPattern; } } cmodule ScenariosFrontend > DynCRUD { S backendModuleLibID = "#1027443/Scenarios"; void handleCommand(Cmd cmd) { print("handleCommand " + cmd.cmd; if (hasAsteriskTokens(cmd.cmd)) print("Has arguments"); else dm_call(getBackend(), 'answer, cmd); } S getBackend() { ret dm_require(backendModuleLibID); } // API void copyCommandsFromBackend() { for (S cmd : allIfQuotedPatterns(loadSnippet(#1027443))) uniqConcept(+cmd); } S answer(S s) null { for (Cmd cmd : conceptSortedByField index(Cmd)) if (mmo_match_parsedPattern(cmd.parsedPattern(), s)) ret with handleCommand(cmd); } }