add strategy pattern