Software Construction: Object-oriented Design