OOP initial rewrite