sclass Borrowable implements AutoCloseable { A object; bool borrowed; *(A *object) {} *() {} synchronized void set(A object) { this.object = object; borrowed = false; } synchronized bool canBorrow() { ret object != null && !borrowed; } synchronized bool isBorrowed() { ret borrowed; } // returns null if object is borrowed synchronized IAutoCloseableF0 tempBorrow() { bool canBorrow = canBorrow(); A o = canBorrow ? object : null; if (canBorrow) borrowed = true; ret new IAutoCloseableF0 { public A get() { ret o; } public void close { unborrow(o); } }; } synchronized void unborrow(A o) { if (o == object) borrowed = false; } public void close() { O o; synchronized(this) { o = object; object = null; } dispose o; } }