http://martinfowler.com/refactoring/catalog/preserveWholeObject.html