**Problem:** Things change. You’d like to know what happened when. But people (and processes and organizations) are imperfect. Put these three facts together and you are faced with a challenge. How do you construct objects that can record and compute correctly in spite of imperfect recording of change?
**Therefore:** Split one conceptual object into two parts, one part that doesn’t change, the History, and one part that does change, the Version. Give the History messages to store and retrieve versions similar to keyed access to a collection. * `History>>versionAt: aTime put: aVersion` - Says that from the point of view of `aTime`, the Version in force is now `aVersion` * `History>>versionAt: aTime` – Returns the version visible from `aTime`
~
Arnoldi, Massimo, Kent Beck, Markus Bieri, and Manfred Lange. “Time Travel: A Pattern Language for Values That Change,” pdf