Object-Oriented Software Engineering with UML: A Hands-On Approach