forked from perl-catalyst/catalyst-runtime
-
Notifications
You must be signed in to change notification settings - Fork 1
/
TODO
204 lines (148 loc) · 8.42 KB
/
TODO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
# Known Bugs:
- Bug ->go or ->visit causes actions which have Args or CaptureArgs called
twice when called via ->go or ->visit.
Test app: http://github.com/bobtfish/catalyst-app-bug-go_chain/tree/master
# Compatibility warnings to add:
- $self->config should warn as config should only ever be called as a
class method (TESTS).
# Proposed functionality / feature additions:
## Log setup needs to be less lame
So Catalyst::Plugin::Log::* can die
in a fire. Having $c->log_class would be a good start. kane volunteered
to do some of this.
Simple example: Catalyst::Plugin::Log::Colorful should just be a
subclass of Catalyst::Log, no ::Plugin:: needed.
See also: Catalyst::Plugin::Log::Dispatch and
http://github.com/willert/catalyst-plugin-log4perl-simple/tree
## throw away the restarter and allow using the restarters Plack provides
## be smarter about how we use PSGI - not every response needs to be delayed
and streaming
# The horrible hack for plugin setup - replacing it:
* Have a look at the Devel::REPL BEFORE_PLUGIN stuff
I wonder if what we need is that combined with plugins-as-roles
# App / ctx split:
NOTE - these are notes that t0m thought up after doing back compat for
catalyst_component_class, may be inaccurate, wrong or missing things
bug mst (at least) to correct before trying more than the first 2
steps. Please knock yourself out on the first two however :)
- Eliminate actions in MyApp from the main test suite
- Uncomment warning in C::C::register_action_methods, add tests it works
by mocking out the logging..
- Remove MyApp @ISA controller (ask metaclass if it has attributes, and if
so you need back compat :/)
- Make Catalyst::Context, move the per request stuff in there, handles from
main app class to delegate
- Make an instance of the app class which is a global variable
- Make new instance of the context class, not the app class per-request
- Remove the components as class data, move to instance data on the app
class (you probably have to do this for _all_ the class data, good luck!)
- Make it possible for users to spin up different instances of the app class
(with different config etc each)
- Profit! (Things like changing the complete app config per vhost, i.e.
writing a config loader / app class role which dispatches per vhost to
differently configured apps is piss easy)
## GSOC
### Final steps for GSOC
##### Things that work:
- the default container loads all components, calls ACCEPT_CONTEXT() when appropriate, and COMPONENT() when appropriate, behaving like current Catalyst does
- its possible to create a custom container, and override the components you want. Lifecycle, class, dependencies, all overridable.
- config files are loaded without Catalyst::Plugin::ConfigLoader
- per request life cycle somewhat works
- external modules are loaded just using a custom container, much like Catalyst::Model::Adaptor
##### Things that don't work:
- expand_component_module
- Some back compat
- wrappers around setup_component, setup_components in Catalyst.pm
- $instance->expand_modules
- search_extra
- Crazy tests for things such as:
sub COMPONENT {
...
*${appclass}::Model::TopLevel::GENERATED::ACCEPT_CONTEXT = sub { ... };
...
}
##### Items for discussion and planning
# (in no particular order, just numbered to be more easily refered to)
1) per request life cycle
2) sugar syntax
3) when / when not COMPONENT should be called
4) problems when get_all_components() is called when there is no 'context' yet
5) Back compat problems:
- expand_component_module
- $instance->expand_modules
- search_extra
- what to do when a user overrides the locate_components method?
6) locate_components service vs setup_components method
- can we be more lazy?
- should setup_components be a service that things like the ->component lookup
can depend on?
7) $class->log->warn is being used to give warnings, but maybe there is a
better way to do it
8) the ConstructorInjection depends on the application_name, which probably
makes app/ctx split harder. We need a way to get the application instance
passed properly.
9) there is a call in Catalyst::Controller to catalyst_component_name class
accessor (which doesn't exist anymore).
10) make ACCEPT_CONTEXT and COMPONENT optional in Catalyst::IOC::BlockInjection and Catalyst::IOC::ConstructorInjection
- Create COMPONENTSingleton life cycle
11) we build the service too early, causing the COMPONENT method to be
called early, breaking components which build other components (e.g.
Model::DBIC::Schema).
12) root service has a very ambiguous name - maybe root_dir?
13) should _get_component_type_name (in Catalyst::IOC::Container) exist?
14) Test cases for extending the container in an application.
- Using the sugar added in the previous item
- Test when Model::Foo depends_on Model::Bar
- Test for component Foo => ( lifecycle => 'Singleton', class => 'My::External::Class', dependencies => { config => depends_on("config") } )
- Fix ^^ so that you can get your component's namespaced config nicely.
15) Tests for using the container outside of Catalyst
- Custom container which adds some (very simple) services which are initialized from
the application config file (note plain services, not components)
- Depend on (and test) these inside Catalyst
- Test loading container outside Catalyst, and these services working
- Test Catalyst / MyApp is not loaded
16) _build_(request|response)_constructor_args need replicating in
this branch.
### Next steps
- Push the config built in the container back up onto the app
- Find a better way to make path_to work. Current fix is in
Catalyst::IOC::Container, subs build_home_service, build_root_service.
- Improve validation on the 'component' methods in Catalyst::IOC
(check the type of the component, etc)
- Thigs to test:
- Imports getting the importing package in Catalyst::IOC
- Back compat for Catalyst.pm moved methods (locate_components)
- Custom container
- writing some tests which verify that the models you think should be
there are there, and that they received their dependencies as arguments
- i.e. Model::Bar should get params { foo => $model_foo } when being
constructed, etc
- Need to test that if you have a standard component Frotz
and a customized component Fnar, and Fnar depends on Frotz
- And yeah, some tests that the customised components actually work via
$c->model('Foo'), and that COMPONENT is called (or not called)
as appropiate and that ACCEPT_CONTEXT is called (or not) as appropriate
#### Extending my app, notes
Basically try to implement something like this (starting out without the sugar!), and see how it breaks
and what needs to be done to fix it!
##### Eventual syntax
package MyApp::Container;
use Catalyst::IOC;
container $self, as {
container model => as {
component Foo => (); # As per default!
component Bar => (dependencies => ['/model/Foo']); # Magic!
component Baz => ( lifecycle => 'InstancePerContext );
component Quux => ( lifecycle => 'Singleton' ); # ACCEPT_CONTEXT not called
# Catalyst::Model::Adaptor example
component Fnar => ( lifecycle => 'Singleton', class => 'My::External::Class', dependencies => { config => depends_on('config')} );
# ^^ FIXME - gets whole config, not Model::Foo
# There should be a 'nice' way to get the 'standard' config
};
# Note - implementation of BB may need to be changed to support making sure existing
# services actually get overridden. not sure how the default container behaves when doing that
# above code would build the constructor injection as it currently does,
# defaulting to the class name in the right namespace as declared by the surrounding container
# as well as adding using the catalyst-specific service class
};
1;