Refactoring: Improving the Design of Existing Code (2nd Edition)