concept G22Variable extends ConceptWithChangeListeners is IPersistenceInfo { settableWithVar S name; settableWithVar volatile O value; settableWithVar bool persistent; // big = value is stored in separate file settableWithVar bool big; // field "value" is persisted iff field "persistent" is set public Map _persistenceInfo() { ret litmap(value := persistent); } void setValueIfNull(O defaultValue) { if (defaultValue != null && value == null) value(defaultValue); } O get() { if (big) ret getBigValue(); ret value; } G22Utils g22utils() { ret main g22utils(_concepts()); } File bigFile() { ret newFile(assertNotNull(g22utils().projectDir()), id + "-" + sanitizeFileName(name) + ".structgz"); } O getBigValue() { File f = bigFile(); ret unstructureGZFile(f, g22utils().classFinder()); } void setBigValue(O value) { File f = bigFile(); saveGZStructureToFile(f, value); } void deleteBigValue() { deleteFile(bigFile()); } void makeBig { if (big || !persistent) ret; setBigValue(value); big(true); value(null); } void makeSmall { if (!big) ret; value(get()); big(false); deleteBigValue(); } }