Object-oriented programming: themes and variations