store the entire object in the audit log before any destructive operation - perform diffs between objects - undo / redo is easier, just swap in the persisted object