4 use Bread::Board qw/depends_on/;
5 use Catalyst::IOC::ConstructorInjection;
8 use Sub::Exporter -setup => {
15 groups => { default => [qw/
26 ${"${caller}::customise_container"} = sub {
27 local ${"${caller}::current_container"} = shift;
32 sub model (&) { _subcontainer( shift, caller, 'model' ) }
33 sub view (&) { _subcontainer( shift, caller, 'view' ) }
34 sub controller (&) { _subcontainer( shift, caller, 'controller' ) }
36 sub _subcontainer (&$$) {
37 my ( $code, $caller, $subcontainer ) = @_;
38 local ${"${caller}::current_container"} =
39 ${"${caller}::current_container"}->get_sub_container($subcontainer);
44 my ($name, %args) = @_;
46 $args{dependencies} ||= {};
47 $args{dependencies}{application_name} = depends_on( '/application_name' );
49 my $lifecycle = $args{lifecycle};
50 my %catalyst_lifecycles = map { $_ => 1 } qw/ COMPONENTSingleton Request /;
51 $args{lifecycle} = $lifecycle
52 ? $catalyst_lifecycles{$lifecycle} ? "+Catalyst::IOC::LifeCycle::$lifecycle" : $lifecycle
56 # FIXME - check $args{type} here!
58 my $component_name = join '::', (
59 ${"${caller}::current_container"}->resolve(service => '/application_name'),
60 ucfirst(${"${caller}::current_container"}->name),
64 my $service = Catalyst::IOC::ConstructorInjection->new(
67 catalyst_component_name => $component_name,
69 ${"${caller}::current_container"}->add_service($service);
80 Catalyst::IOC - IOC for Catalyst, based on Bread::Board
84 package MyApp::Container;
90 container $self => as {
91 container model => as {
96 # model Bar needs model Foo to be built before
97 # and Bar's constructor gets Foo as a parameter
98 component Bar => ( dependencies => [
99 depends_on('/model/Foo'),
102 # Baz is rebuilt once per HTTP request
103 component Baz => ( lifecycle => 'Request' );
105 # built only once per application life time
106 component Quux => ( lifecycle => 'Singleton' );
108 # built once per app life time and uses an external model,
109 # outside the default directory
110 # no need for wrappers or Catalyst::Model::Adaptor
112 lifecycle => 'Singleton',
113 class => 'My::External::Class',
135 Catalyst Contributors, see Catalyst.pm
143 This library is free software. You can redistribute it and/or modify it under
144 the same terms as Perl itself.