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