use warnings;
use Bread::Board qw/depends_on/;
use Catalyst::IOC::ConstructorInjection;
+no strict 'refs';
-# FIXME - All of these imports need to get the importing package
-# as the customise_container and current_container variables
-# NEED to be in the containers package so there can be multiple
-# containers..
use Sub::Exporter -setup => {
exports => [qw/
depends_on
container
/]},
};
-#use Sub::Exporter -setup => [
-# qw(
-# Bread::Board::as
-# Bread::Board::container
-# Bread::Board::depends_on
-# Bread::Board::service
-# Bread::Board::alias
-# Bread::Board::wire_names
-# Bread::Board::include
-# Bread::Board::typemap
-# Bread::Board::infer
-# )
-#];
-# I'm probably doing it wrong.
-# Anyway, I'll just use Moose::Exporter. Do I really have to use Sub::Exporter?
-#use Moose::Exporter;
-#Moose::Exporter->setup_import_methods(
-# also => ['Bread::Board'],
-#);
-our $customise_container;
-our $current_container;
sub container (&) {
my $code = shift;
- $customise_container = sub {
- warn("In customise container");
- local $current_container = shift();
+ my $caller = caller;
+ ${"${caller}::customise_container"} = sub {
+ local ${"${caller}::current_container"} = shift;
$code->();
};
}
sub model (&) {
my $code = shift;
- local $current_container = $current_container->get_sub_container('model');
+ my $caller = caller;
+ local ${"${caller}::current_container"} = ${"${caller}::current_container"}->get_sub_container('model');
$code->();
}
sub component {
my ($name, %args) = @_;
+ my $caller = caller;
$args{dependencies} ||= {};
$args{dependencies}{application_name} = depends_on( '/application_name' );
+ my $lifecycle = $args{lifecycle};
+ my %catalyst_lifecycles = map { $_ => 1 } qw/ COMPONENTSingleton Request /;
+ $args{lifecycle} = $lifecycle
+ ? $catalyst_lifecycles{$lifecycle} ? "+Catalyst::IOC::LifeCycle::$lifecycle" : $lifecycle
+ : 'Singleton'
+ ;
+
# FIXME - check $args{type} here!
my $component_name = join '::', (
- $current_container->resolve(service => '/application_name'),
- ucfirst($current_container->name),
+ ${"${caller}::current_container"}->resolve(service => '/application_name'),
+ ucfirst(${"${caller}::current_container"}->name),
$name
);
my $service = Catalyst::IOC::ConstructorInjection->new(
%args,
- name => $name,
- lifecycle => 'Singleton',
- # XX FIXME - needs to become possible to intuit catalyst_component_name
- # from dependencies (like config)
+ name => $name,
catalyst_component_name => $component_name,
);
- $current_container->add_service($service);
+ ${"${caller}::current_container"}->add_service($service);
}
1;
-# FIXME - should the code example below be on this file or Catalyst::IOC::Container?
-
__END__
=pod