I, and from what I gather many others, switched to a kind of Event-Driven system in development. Esp of larger systems. I use a custom-made Callback-Manager in combination with Extensions to move arround events in the project. But this approach is still somewhat limited as you cannot fetch events from children and so on.
What I see is a general
EmitEvent("Event name", *args, bubble = False, **kwargs) method implemented into the core OP-Class.
Secondary to that it would need a EventDAT, which either has a onEvent-callback, or makes it possible to compose callbacks out of the methodname (basicly taking the Event Name as the method name).
Another approach (semantics) would be to pass a dictionary as data alá JS and have a general onEvent-Callback in the eventDAT and be able to filter for events like in the errorDAT or chopExecuteDAT.