Everything looks good, but a possible improvement: I'm not 100% sure about how the events are generated, but what if the state was included as part of the event (seems to make sense)? That way you don't need to pass in the whole GameController