The previous series of posts on the topic of Event Reflexivity each posed a question about what the general shape of the design pattern actually is. Over the following months after the posts I thought about the pattern a lot more and eventually came to the conclusion that a lot of the questions aren't a simple matter of choosing what's correct - the reason these questions are hard to answer is that both options could be correct. What I have here is in fact not a single unclear design pattern, but instead a whole family of possible choices on a design pattern, with different specifics being more useful to specific cases.
The specific design choices that a particular implementation takes should answer such questions as:
- Ordering control: Are subscribers of some named action invoked in a controllable fashion?
- Invocation functions: What kinds of actions or ways of invoking them are actually provided?
- Heirarchial actions: Do the types of actions occupy a simple flat namespace, or is there some heirarchial structure to them? Can a subscriber catch an entire subspace of actions at once?
- Explicit or implicit subscription: Do subscribers have to explicitly list every action (or action subspace) they wish to receive?
- Filterable arguments: Does the implementation offer a built-in way to filter specific values of arguments by some pre-declared pattern?
Perhaps the only real design question for the Event-Reflexive Design Pattern Pattern is to decide on some neat concise language that implementations can use to explain their specific choices on these issues.