sclass FunctionsLoader implements AutoCloseable { Set functions; O blob; Throwable exception; bool loading; L onLoaded = syncList(); // also called on fail O[] loadFunctionsParams; *(Iterable functions) { this.functions = asSet(functions); } synchronized void loadInBackground { if (!loading) { loading = true; startThread(r load); } } void load { try { blob = loadFunctions(functions, loadFunctionsParams); } catch print e { exception = e; } pcallFAll(onLoaded); } public void close { dispose blob; } bool loaded() { ret blob != null || exception != null; } bool hasCode() { ret blob != null; } O blob() { ret blob; } void onLoaded(Runnable r) { onLoaded.add(r); } }