srecord UndoCreateConcept(long conceptID) implements UndoableWithAnswer { transient Concepts cc = db_mainConcepts(); toString { ret "Create " + getConcept(conceptID); } public S undo() { Concept c = getConcept(cc, conceptID); S result = "Deleted " + c + " again"; deleteConcept(conceptID); ret result; } } srecord UndoDeleteConcept(Concept concept) implements UndoableWithAnswer { transient Concepts cc = db_mainConcepts(); toString { ret "Delete " + concept; } public S undo() { registerConcept(cc, concept); ret "Restored " + concept; } } srecord UndoSetConceptField(long conceptID, S field, O value, O newValue) implements UndoableWithAnswer { transient Concepts cc = db_mainConcepts(); toString { ret "Set " + field + " of " + getConcept(conceptID) + " to " + newValue; } public S undo() { Concept c = getConcept(cc, conceptID); S result = "Reset " + field + " of " + c + " to " + value; cset(c, field, value); ret result; } }