Add additional TODO notes from a quick read
[catagits/Catalyst-Runtime.git] / TODO
CommitLineData
77d892df 1# Known Bugs:
cdb34619 2
3 - Bug ->go or ->visit causes actions which have Args or CaptureArgs called
4 twice when called via ->go or ->visit.
5
6 Test app: http://github.com/bobtfish/catalyst-app-bug-go_chain/tree/master
7
77d892df 8# Compatibility warnings to add:
9
10 - $self->config should warn as config should only ever be called as a
5d94e8f9 11 class method (TESTS).
77d892df 12
13# Proposed functionality / feature additions:
14
15## Log setup needs to be less lame
16
17So Catalyst::Plugin::Log::* can die
18in a fire. Having $c->log_class would be a good start. kane volunteered
19to do some of this.
20
21Simple example: Catalyst::Plugin::Log::Colorful should just be a
22subclass of Catalyst::Log, no ::Plugin:: needed.
23
24See also: Catalyst::Plugin::Log::Dispatch and
25http://github.com/willert/catalyst-plugin-log4perl-simple/tree
26
27# REFACTORING
28
29## The horrible hack for plugin setup - replacing it:
30
31 * Have a look at the Devel::REPL BEFORE_PLUGIN stuff
32 I wonder if what we need is that combined with plugins-as-roles
33
34## App / ctx split:
35
36 NOTE - these are notes that t0m thought up after doing back compat for
5d94e8f9 37 catalyst_component_class, may be inaccurate, wrong or missing things
77d892df 38 bug mst (at least) to correct before trying more than the first 2
39 steps. Please knock yourself out on the first two however :)
40
41 - Eliminate actions in MyApp from the main test suite
42 - Uncomment warning in C::C::register_action_methods, add tests it works
43 by mocking out the logging..
44 - Remove MyApp @ISA controller (ask metaclass if it has attributes, and if
45 so you need back compat :/)
46 - Make Catalyst::Context, move the per request stuff in there, handles from
47 main app class to delegate
48 - Make an instance of the app class which is a global variable
49 - Make new instance of the context class, not the app class per-request
50 - Remove the components as class data, move to instance data on the app
51 class (you probably have to do this for _all_ the class data, good luck!)
52 - Make it possible for users to spin up different instances of the app class
53 (with different config etc each)
54 - Profit! (Things like changing the complete app config per vhost, i.e.
55 writing a config loader / app class role which dispatches per vhost to
56 differently configured apps is piss easy)
19c64905 57
58## GSOC
59
a43734f6 60### Next large steps, planned:
61
62For all components that have been discovered, in whatever way, we create a service:
63 - that's a catalyst component service
64 - which is basically just a constructor injection
65 - except the constructor name is COMPONENT
66 - and we're "implicitly" passing along some constructor args
67 - Lifecycle => Singleton
68
f5dbaa05 69 - Fix B::B so that Service::WithParametrs' parameters attribute has a builder
70 - Fix ConstructorInjection so that default parameters are supplied (for accept_context_args)
71 - Fix ConstructorInjection's 'suffix' - should be called 'config_key' or something, and
72 should be an attribute on the service (as it never changes), rather than a parameter
73 to the service
74
a43734f6 75 - We make a 'components' sub container in the main container.
76 - This gets the ConstructorInjection COMPONENT services, as model_Foo.
77 - Lifecycle of these services is Singleton
78 - This simplifies the code for MyApp->components, as it need only list one sub-container
79
80 - We create a second service (depending on the first one) for ACCEPT_CONTEXT
81 - This has a custom service which calls ACCEPT_CONTEXT when the instance is fetched
82 - Not Singleton lifecycle
83
84 Note - ACCEPT_CONTEXT can be called on app values - if you have a Model::Foo, with an ACCEPT_CONTEXT
85 and you call MyApp->model('Foo') then ACCEPT_CONTEXT gets invoked with a $c of 'MyApp' (this is not\
86 the normal case, but we need to preserve for compat)
87
88### Next steps - less planned:
731a4757 89
334eb9fb 90 - Creating service()-like sugar for component
91
731a4757 92 - Test cases for extending the container in an application.
334eb9fb 93 - Using the sugar added in the previous item
94 - Test when Model::Foo depends_on Model::Bar
731a4757 95
4634d3ad 96
f5dbaa05 97#### Extending my app, notes
98
99Basically try to implement something like this (starting out without the sugar!), and see how it breaks
100and what needs to be done to fix it!
101
102##### Eventual syntax
103
104package MyApp::Container;
105use Catalyst::IOC;
106
107 container $self, as {
108 container model => as {
109 component Foo => (); # As per default!
110 component Bar => (dependencies => ['/model/Foo']); # Magic!
111 component Baz => ( lifecycle => 'InstancePerContext );
112 component Quux => ( lifecycle => 'Singleton' ); # ACCEPT_CONTEXT not called
113 };
114 # Note - implementation of BB may need to be changed to support making sure existing
115 # services actually get overridden. not sure how the default container behaves when doing that
116 # above code would build the constructor injection as it currently does,
117 # defaulting to the class name in the right namespace as declared by the surrounding container
118 # as well as adding using the catalyst-specific service class
119 };
120
1211;
122
123##### To start with
124
125package MyApp::Container;
126use Moose;
127
128extends 'Catalyst::Container;
129
130after BUILD => sub {
131 my $self = shift;
132 my $model_container = $self->get_sub_container('model');
133 my $service = Catalyst::IOC::ConstructorInjection->new(
134 name => 'Baz',
135 class => 'MyApp::Model::Baz',
136 dependencies => [
137 depends_on( '/application_name' ),
138 depends_on( '/config' ),
139 depends_on( '/model/Foo' ),
140 ],
141 lifecycle => 'InstancePerContext',
142 );
143 $model_container->add_service( 'Foo', $service );
144};
19c64905 145
a43734f6 146### To polish off / t0m review
19c64905 147
19c64905 148 - + $class->container->get_sub_container('model')->make_single_default;
a43734f6 149 + $class->container->get_sub_container('view')->make_single_default;
150
c3125988 151 +sub controller { shift->_lookup_mvc('controller', @_) }
152
a43734f6 153 get_components_names_types
154
155 locate_components
156
157 +# FIXME - t0m, how do you feel about this name?
158 +# also, do you think I should draw it here, or just return the data structure?
159 +sub get_components_names_types {
160
161 + MyApp->config->{ 'Plugin::ConfigLoader' }->{ substitutions } = {
162
163 +# FIXME - just till I understand how it's supposed to be done
164 +# Made this so that COMPONENT is executed once,
165 +# and ACCEPT_CONTEXT every call.
166 +has instance => (
167 + is => 'rw',
168
169 # This is ok??
170 +my $applevel_config = TestAppContainer->container->resolve(service => 'config')->{applevel_config};
171 +__PACKAGE__->config(applevel_config => 'foo');
172
173
c3125988 174 +Same as L<build_model_subcontainer>, but for controllers. The difference is
175 +that there is no ACCEPT_CONTEXT for controllers.
176 ^^ This is wrong!!
177
178 - my $accept_context_args = $self->param('accept_context_args');
179 + my $accept_context_args = $params{accept_context_args};
180 ^^ This is wrong! The service should be allowed to mangle the accept_context args, no?
181 Without this change, the user could make a custom service which mangled the param, and use
182 Catalyst/IOC/Service/WithAcceptContext.pm, with this change, that module will always see the
183 un-mangled version??
184
a43734f6 185 accept_context_args - where does this come from?
c3125988 186
187 + $purity = $purity // 1;
188 ^^ perl 5.10 only
4634d3ad 189
190### Known issues
191
192 - Broken $instance->expand_modules() in setup_components and figure
193 out later how to bring it back
194
195 - expand_component_module
196