sinterface IMeta { // see class "Meta" for the bla bla public void _setMeta(O meta); public O _getMeta(); default public IAutoCloseableF0 _tempMetaMutex() { ret new IAutoCloseableF0 { public O get() { ret IMeta.this; } public void close {} }; } // actually query another object default public O metaGet aka getMeta(O obj, O key) { // call global function ret metaMapGet(obj, key); } default public O metaGet(S key, O obj) { // call global function ret metaMapGet(obj, key); } default public O metaGet aka getMeta(O key) { if (key == null) null; O meta = _getMeta(); if (meta cast Map) ret meta.get(key); null; } default public void metaPut aka metaSet(IMeta obj, O key, O value) { // call global function metaMapPut(obj, key, value); } default public void metaPut aka metaSet(O key, O value) { if (key == null) ret; Map map = convertObjectMetaToMap(this); syncMapPutOrRemove(map, key, value); } }