3 - Bug ->go or ->visit causes actions which have Args or CaptureArgs called
4 twice when called via ->go or ->visit.
6 Test app: http://github.com/bobtfish/catalyst-app-bug-go_chain/tree/master
8 # Compatibility warnings to add:
10 - $self->config should warn as config should only ever be called as a
13 # Proposed functionality / feature additions:
15 ## Log setup needs to be less lame
17 So Catalyst::Plugin::Log::* can die
18 in a fire. Having $c->log_class would be a good start. kane volunteered
21 Simple example: Catalyst::Plugin::Log::Colorful should just be a
22 subclass of Catalyst::Log, no ::Plugin:: needed.
24 See also: Catalyst::Plugin::Log::Dispatch and
25 http://github.com/willert/catalyst-plugin-log4perl-simple/tree
29 ## The horrible hack for plugin setup - replacing it:
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
36 NOTE - these are notes that t0m thought up after doing back compat for
37 catalyst_component_class, may be inaccurate, wrong or missing things
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 :)
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)
60 ### Next steps - less planned:
62 - Creating service()-like sugar for component
64 - Test cases for extending the container in an application.
65 - Using the sugar added in the previous item
66 - Test when Model::Foo depends_on Model::Bar
68 - Tests for using the container outside of Catalyst
69 - Custom container which adds some (very simple) services which are initialized from
70 the application config file (note plain services, not components)
71 - Depend on (and test) these inside Catalyst
72 - Test loading container outside Catalyst, and these services working
73 - Test Catalyst / MyApp is not loaded
75 #### Extending my app, notes
77 Basically try to implement something like this (starting out without the sugar!), and see how it breaks
78 and what needs to be done to fix it!
82 package MyApp::Container;
86 container model => as {
87 component Foo => (); # As per default!
88 component Bar => (dependencies => ['/model/Foo']); # Magic!
89 component Baz => ( lifecycle => 'InstancePerContext );
90 component Quux => ( lifecycle => 'Singleton' ); # ACCEPT_CONTEXT not called
92 # Note - implementation of BB may need to be changed to support making sure existing
93 # services actually get overridden. not sure how the default container behaves when doing that
94 # above code would build the constructor injection as it currently does,
95 # defaulting to the class name in the right namespace as declared by the surrounding container
96 # as well as adding using the catalyst-specific service class
103 package MyApp::Container;
106 extends 'Catalyst::Container;
110 my $model_container = $self->get_sub_container('model');
111 my $service = Catalyst::IOC::ConstructorInjection->new(
113 class => 'MyApp::Model::Baz',
115 depends_on( '/application_name' ),
116 depends_on( '/config' ),
117 depends_on( '/model/Foo' ),
119 lifecycle => 'InstancePerContext',
121 $model_container->add_service( 'Foo', $service );
124 ### To polish off / t0m review
126 - my $accept_context_args = $self->param('accept_context_args');
127 + my $accept_context_args = $params{accept_context_args};
128 ^^ This (may be) wrong! I am thinking the service should be allowed to mangle the
129 accept_context args, no?
130 Without this change, the user could make a custom service which mangled the param, and use
131 Catalyst/IOC/Service/WithAcceptContext.pm, with this change, that module will always see the
132 un-mangled version?? However, without this change, shit doesn't work...
136 - Broken $instance->expand_modules() in setup_components and figure
137 out later how to bring it back
139 - expand_component_module
141 - People wrapping locate_components in Catalyst.pm