Можно еще со связными списками поиграться.
Сделать класс "Действие"
У каждого действия есть один вход и массив выходов.
Наследуемся от этого абстрактного действия и просто указываем список выходов - что он должен дернуть при завершении при определенных условиях. Коллбеками удобнее наверное будет.
Можно и на события завязать, но тогда надо будет наоборот - список входов - и один выход
Плюс какой-то манагер простенький для этого всего, там буквально два публичных метода: добавить/убрать из/в список(а)