record UndoCreateConcept(long conceptID) > Undo { toString { ret "Create " + getConcept(conceptID); } S undo() { Concept c = getConcept(conceptID); S result = "Deleted " + c + " again"; deleteConcept(conceptID); ret result; } } record UndoDeleteConcept(Concept concept) > Undo { toString { ret "Delete " + concept; } S undo() { registerConcept(concept); ret "Restored " + concept; } } record UndoSetConceptField(long conceptID, S field, O value, O newValue) > Undo { 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; } }