Mine is a more generic messaging system then PeerOS. PeerOS uses a document/view model, mine is more like... I don't really know what model it would be called. How about examples and descriptions instead:
Using PeerOS you have a 'document' class which has events that can be handled elsewhere. You also define a message class for it, and listeners also subclass from something else as well and can register themselves to the document.
Mine was originally started for an input action-map, it just kept growing though. There is one main class, a singleton, you treat it as this (I don't have the code in front of me right now so doing this from memory):
To register a new action:
ActionMap::getSingleton().addAction("quit");
You can link it to any amount of actions that are already defined (there are a few predefined ones as well, mostly input's):
ActionMap::getSingleton().addPersistantLink("KC_ESCAPE","quit");
If you use addLink() instead, it returns a connection object, when that object goes out of scope or you manually call Disconnect() on it or whatever, the link disappears.
Now this is good, if you hit escape (a prebuilt event), it calls quit, and anything else linked to it, and anything linked to quit or those anythings, you can also link between like "KC_Q" and "quit" if you want as well, it is a many-to-many relationship. But say you have an action/event of your own, that you want to call, well, addAction both creates and returns, or returns if it already exists, an action/event object, so:
actionEventDontRecallTheTypeName aQuitAction = ActionMap::getSingleton().addAction("quit");
And you can pass that around, so if something wants to register to you, you can either give them the variable, or you can link it yourself if they pass an object.
To call an action/event, you do:
(*aQuitAction)(0.0f);
I have it take floats right now, as stated, was made for inputs originally, but if I find a need to pass other things, I'll probably change it to an Any, very simple change to make.
Now, making, linking, and causing events to happen is all well and good, but useless without something to listen to it, to register a function, member function, functor, etc... etc... then you do:
DontRecallTheLinkTypname aLink1 = ActionMap::getSingleton().addLink("quit", &aQuitStaticFunction);
DontRecallTheLinkTypname aLink2 = ActionMap::getSingleton().addLink("quit", bind(&aQuitMemberFunction,thisOrClassPointer,_1)); // Will make this into a function overload later so the bind junk will be unnecessary
DontRecallTheLinkTypname aLink3 = ActionMap::getSingleton().addLink("quit", aQuitFunctor);
Of course you could use addPersistentLink if you want it to persist until program exit.
There are a few other abilities of it like (un)serializing, but I need to go.