add state & strategy pattern