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;
}
}