use Hash::Util qw/lock_hash/;
use MooseX::Types::LoadableClass qw/ LoadableClass /;
use Moose::Util;
+use Scalar::Util qw/refaddr/;
use Catalyst::IOC::BlockInjection;
use Catalyst::IOC::ConstructorInjection;
use Module::Pluggable::Object ();
$self->add_sub_container(
$self->build_model_subcontainer( @default_model )
);
+
+ {
+ no strict 'refs';
+ no warnings 'once';
+ my $class = ref $self;
+ warn("In build $class");
+ ${ $class . '::customise_container' }->($self)
+ if ${ $class . '::customise_container' };
+ }
}
sub build_model_subcontainer {
my %comps = map { $_ => 1 } @comps;
my $deprecatedcatalyst_component_names = 0;
+ my $app_locate_components_addr = refaddr(
+ $class->can('locate_components')
+ );
+ my $cat_locate_components_addr = refaddr(
+ Catalyst->can('locate_components')
+ );
+
+ if ($app_locate_components_addr != $cat_locate_components_addr) {
+ $class->log->warn(qq{You have overridden locate_components. That } .
+ qq{no longer works. Please refer to the documentation to achieve } .
+ qq{similar results.\n}
+ );
+ }
+
for my $component ( @comps ) {
# We pass ignore_loaded here so that overlay files for (e.g.)
}
sub _find_component_regexp {
- my ( $self, $component, @args ) = @_;
+ my ( $self, $component, $ctx, @args ) = @_;
my @result;
- my @components = grep { m{$component} } keys %{ $self->get_all_components };
+ my @components = grep { m{$component} } keys %{ $self->get_all_components($ctx) };
for (@components) {
my ($type, $name) = _get_component_type_name($_);
push @result, $self->get_component_from_sub_container(
- $type, $name, @args
+ $type, $name, $ctx, @args
) if $type;
}
}
sub get_all_components {
- my $self = shift;
+ my ($self, $class) = @_;
my %components;
# FIXME - if we're getting from these containers, we need to either:
# - pass 'ctx' and 'accept_context_args' OR
# - make these params optional
+ # big problem when setting up the dispatcher - this method is called
+ # as $container->get_all_components('MyApp'). What to do with Request
+ # life cycles?
foreach my $type (qw/model view controller /) {
my $container = $self->get_sub_container($type);
for my $component ($container->get_service_list) {
- my $comp = $container->resolve(
- service => $component
- );
- my $comp_name = ref $comp || $comp; # THIS IS WRONG! :)
- # Just as it is called Model::Foo
- # does not mean it has to be
- # an instance of model::foo
- # (André's answer)
- # t0m, you're absolutely right, I really hadn't thought about it.
- # But then, we have a problem: suppose there is a component called
- # MyApp::M::Foo, for instance. The service name would be 'Foo',
- # and it would be stored in the 'model' sub container. So we have
- # $app_name . '::' . uc_first($type) . '::' . $service_name
- # that would return MyApp::Model::Foo. It would get really, really
- # ugly to check MyApp::M::Foo. So, either we change the hash key,
- # or we drop support for ::[CMV]::, or I don't know, maybe you
- # have a better solution? :)
- # maybe catalyst_component_name? But then we'd have the same
- # problem on Catalyst::IOC line 73
-
- $components{$comp_name} = $comp;
+ my $comp_service = $container->get_service($component);
+
+ $components{$comp_service->catalyst_component_name} = $comp_service->get(ctx => $class);
}
}
$accept_context_container->add_service(
Catalyst::IOC::BlockInjection->new(
name => $name,
+ catalyst_component_name => $component,
dependencies => [
depends_on( "/component/$component_service_name" ),
],