final refactor for now before adding more features