sclass CloseablesHolder > Meta is AutoCloseable, IResourceHolder { new LinkedHashSet closeables; WeakRef createdInThread = weakRef(currentThread()); public synchronized void addAll(Iterable l) { fOr (var a : l) add(a); } public synchronized A add(A a) { if (a != null) closeables.add(a); ret a; } // remove from list, don't close synchronized A remove aka takeOut(A a) { closeables.remove(a); ret a; } // close and remove synchronized A close(A a) { if (a == null) ret a; closeables.remove(a); main close(a); ret a; } close { for (AutoCloseable c : reversed(takeAll())) main close(c); } public synchronized void forget aka clear() { closeables.clear(); } public synchronized Cl takeAll() { ret cloneAndClear(closeables); } }