Guess the classic OOP solution would be the memento pattern. A particularly easy approach to achieve that, would be by using immutable data structures which can basically act as there own snapshot at any time.
Another approach would be to reify actions into a data type and store the sequence of all applied actions, which can then be (partially) replayed at will later on, i.e., as in the command pattern which is also common to support undo/redo operations.
Finally, here is a nice wrap-up showing how these (as well as most other OOP patterns) become easier in a language (Clojure) with first class functions and immutable data structures.