Commit | Line | Data |
ff05b07e |
1 | TODO, or the plan for making this stuff work right. |
2 | |
3 | The goals: |
4 | |
5 | 1/ I want to be able to specify a Controller base class, like |
6 | Catalyst::Controller::MessageDriven. That's where my |
7 | message-handling actually lives, so I want to build controllers |
8 | based on that, or whichever other class. |
9 | |
10 | 2/ We need a calling convention for the model implementations - in the |
11 | absence of defined interfaces this should be simple unblessed data, |
12 | but if we do have an interface, we should be able to put proper |
13 | constraints on it. |
14 | |
15 | 3/ Given generated controllers where I expose a bunch of methods from |
16 | the actual model classes, there needs to be some way to control |
17 | which methods are dispatchable - "very public", if you like. |
18 | |
19 | 4/ I'd like to be able to write down an "interface", consisting of a |
20 | set of messages my app is willing to handle, and have the framework |
21 | (or the controller base class, probably) reject messages that |
22 | aren't in that set. |
23 | |
24 | 5/ I'd also like to be able to say in that interface definition what |
25 | types of object those methods expect as a payload. |
26 | |
27 | 6/ It'd be nice if exceptions from model methods were caught by the |
28 | framework and converted into messages representing the error - |
29 | i.e. to set an error status, and return the text of the exception. |
30 | |
31 | All these things should be based on configuration. So, we've got |
32 | something to say what classes expose methods, which of those methods |
33 | are dispatchable, and which types are expected. |
34 | |
35 | Possible Implementation |
36 | |
37 | We can provide a number of controller base classes, for a number of |
38 | different message styles: YAML with type-tags, JSON bare hashes, |
39 | etc. These should be selectable by configuration, as a default |
40 | controller class plus overrides for specific controllers. |
41 | |
42 | The calling convention to model methods should be the "payload". That |
43 | might be a bare hashref for simple messages, or a blessed object of |
44 | some app-specific type if the message format contains first-class |
45 | objects, like tagged YAML. |
46 | |
47 | The "interfaces" should be Roles, which don't provide any methods but |
48 | which "need" methods to be implemented. We then use the "needed" |
49 | methods as the set of dispatchable methods, given if we compile OK, we |
50 | know that the model class has all the required methods. |
51 | |
52 | Types are implemented as type signatures on role methods, and we copy |
53 | them onto the actual methods on the model class at compile time. |
54 | |
55 | Exception handling probably needs to be behaviour from the controller |
56 | base class, so that it can be specific to the type of message |
57 | serialization being used. |