Context-oriented programming: A software engineering perspective