// TODO: run dbBot() sclass ConceptsLoadedOnDemand { new Map loaded; // key = just the case ID. value can be null in case of error L onCaseLoaded; // L Lock lock = lock(); Concepts get(S caseID) { ret conceptsForCase(caseID); } // caseID may be empty, then you get the program's main DB Concepts conceptsForCase(S caseID) { lock lock; //assertNempty(+caseID); caseID = unnull(caseID); if (loaded.containsKey(caseID)) ret assertNotNull("Concepts load error", loaded.get(caseID)); S id = combineWithSlash(getDBProgramID(), caseID); print("Loading concepts for case " + id); Concepts c = new Concepts(id); loaded.put(caseID, c); pcallFAll(onCaseLoaded, caseID, c); ret c; } void cleanMeUp { cleanUpAndClear(loaded); } void onCaseLoaded(VF2 f) { onCaseLoaded = listCreateAndAdd(onCaseLoaded, f); } }