Sounds like a complex game. Have you considered using a more generic event system with an event bus?
The IO module could listen to the key events and store them in one keySequence object with a sequence map which is ordered and with the key identifier and the current state of the key (or a ring buffer of 5 key / key state pairs).
Now you'd have two options:
- fire a generic keySequenceChangeEvent on the event bus and let a complex eventListener react to the event
- let the IO module analyze the keySequence (create unique hash keys and lookup an event constant in a map), fire a specific userActionEvent and write several specialized (and more simple) eventListeners for those events
Guess in both cases that architecture would allow you to couple the modules more loosely and be more flexible later on. Several modules could react to a keyEvent without putting it all in the one "do something" block. They just need to have access to the event bus.