sclass CFile extends Concept { S fileProgID; S fileName; // optional, relative (program ID + "/" + file name) *() {} *(S *fileProgID, S *fileName) {} File file() { ret getProgramFile(fileProgID, fileName); } bool fileExists() { ret file().exists(); } void makeDefaultName(S extension) { if (fileName != null || loading()) ret; if (id == 0) fail("No ID"); fileProgID = dbProgramID(); fileName = shortDynClassName(this) + id + addPrefix(".", extension); } }