// 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); } Concepts conceptsForCase(S caseID) { lock lock; assertNempty(+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 onLoad(VF2 f) { onLoad = listCreateAndAdd(onLoad, f); } }