!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"; S handleCommand(Cmd cmd) { print("handleCommand " + cmd.cmd; if (hasAsteriskTokens(cmd.cmd)) ret "Need arguments"; else ret (S) 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 : conceptsSortedByField Cmd('index)) if (mmo_match_parsedPattern(cmd.parsedPattern(), s)) ret handleCommand(cmd); } }