better OO structure