Object-oriented software construction (2nd ed.)