!7 sclass ORef { S globalID = aGlobalID(); WeakReference ref; new Set forMachines; long created = now(), lastAccessed; } module ObjectReferences > DynObjectTable { transient Map byGlobalID = synchroMap(); transient Map byObject = weakIdentityHashMap(); // API // returns global ID S addReferencedObject(O object, S forMachine) { lock lock; ORef r = byObject.get(object); if (r == null) { new ORef r; r.ref = weakRef(object); byGlobalID.put(r.globalID, r); byObject.put(object, r); } r.lastAccessed = now(); r.forMachines.add(forMachine); ret r.globalID; } O getReferencedObject(S globalID) { ORef r = byGlobalID.get(r); ret r == null ? null : r.ref!; } }