begin oject oreented refactor