cleaned up OOP