Command pattern & undo with 3 variations (snapshot, replay, compensation)