refactor and experiment strategy pattern