make code more decoupled