refactored using boilerplate