major refactoring using holder pattern