Object-oriented programming in practice