## GSOC
-### Next large steps:
-
- - Finished documentation for ::IOC parts.
+### Next steps - planned:
+
+ - Test 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
+
+ - Kill flush_request_services
+ - we're already passing $ctx in when we locate services so the ::Request
+ lifecycle can just stash the object in, or retrieve the object from the
+ stash
+ (actually, we're not passing $ctx when we locate services. Problem!)
+
+### Next steps - less planned:
- Creating service()-like sugar for component
- 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
-
- - Allowing people to change component lifecycles
-
- role Service::WithAcceptContext {}
- role Service::WithCOMPONENT {}
- class Service::CatalystComponent extends Service with (WithAcceptContext, WithCOMPONENT) {}
-
- a) configure additional services in that container
- - super simple container $default_container => as { more services };
- class MyApp::Container extends Catalyst::Container {
- use Bread::Board; # Or our own sugar?
- method BUILD { container $self => as {
- service model => ...; # some constructor injection to MyApp::Model or something
- container Model => as {
- component Foo => (dependencies => ['/model']); # As per default!
- component Bar => (dependencies => ['/model/Foo']); # Magic!
- };
- # 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
- } }
- };
- b) make component services depend on that, and
-
-
- c) ask for those
- services declared in a) outside of a web context
- simple as well. $customised_container->fetch('service')->get # or whatever the api was
-
-19:23 < andrewalker> edenc, when explaining to me how it should be, drafted this: https://gist.github.com/1098186
-19:26 < edenc> I like the possibility of being able to provide a backwards-compatible structure which we can muck around with by configuring B::B
-19:26 <@rafl> so, the request context clearly isn't a service
-19:27 <@rafl> but that's ok. there's parametrised services
-19:27 < edenc> yeah, that was a draft
-19:27 <@rafl> the outer Foo service is pretty much what i'd expect Service::WithAcceptContext to do, except with a dependency on a context instead of a service parameter
-19:32 <@rafl> actually having services for the pre-ACCEPT_CONTEXT bits is what i want to think about
-
-### To polish off
-
- - Document current methods
- - + $class->container->get_sub_container('model')->make_single_default;
-+ $class->container->get_sub_container('view')->make_single_default;
+ - 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.
+
+ - 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
+
+#### 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
+ conponent 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;
+
+##### To start with
+
+package MyApp::Container;
+use Moose;
+
+extends 'Catalyst::Container;
+
+after BUILD => sub {
+ my $self = shift;
+ my $model_container = $self->get_sub_container('model');
+ my $service = Catalyst::IOC::ConstructorInjection->new(
+ name => 'Baz',
+ class => 'MyApp::Model::Baz',
+ dependencies => [
+ depends_on( '/application_name' ),
+ depends_on( '/config' ),
+ depends_on( '/model/Foo' ),
+ ],
+ lifecycle => 'InstancePerContext',
+ );
+ $model_container->add_service( 'Foo', $service );
+};
+
+### To polish off / t0m review
+
+ 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?
+
+ - my $accept_context_args = $self->param('accept_context_args');
+ + my $accept_context_args = $params{accept_context_args};
+ ^^ This (may be) wrong! I am thinking the service should be allowed to mangle the
+ accept_context args, no?
+ Without this change, the user could make a custom service which mangled the param, and use
+ Catalyst/IOC/Service/WithAcceptContext.pm, with this change, that module will always see the
+ un-mangled version?? However, without this change, shit doesn't work...
### Known issues
- expand_component_module
+ - People wrapping locate_components in Catalyst.pm