Principles of object oriented programming