full refactor. use fabric, OOP