modified OOP