refactor, expose only when need