use Config::Any;
use Data::Visitor::Callback;
use Catalyst::Utils ();
+use List::Util qw(first);
use Devel::InnerPackage ();
use Hash::Util qw/lock_hash/;
use MooseX::Types::LoadableClass qw/ LoadableClass /;
$self->add_sub_container(
$self->build_model_subcontainer( @default_model )
);
+
+ {
+ no strict 'refs';
+ my $class = ref $self;
+ warn("In build " . ${ $class . '::customise_container' });
+ ${ $class . '::customise_container' }->($self);
+ }
}
sub build_model_subcontainer {
sub setup_components {
my $self = shift;
+ warn("Setting up default components");
my $class = $self->resolve( service => 'application_name' );
my @comps = @{ $self->resolve( service => 'locate_components' ) };
my %comps = map { $_ => 1 } @comps;
}
# one last search for things like $c->comp(qr/::M::/)
- @result = $self->find_component_regexp(
+ @result = $self->_find_component_regexp(
$component, @args
) if !@result and ref $component;
return @result;
}
-sub find_component_regexp {
- my ( $self, $component, @args ) = @_;
+sub _find_component_regexp {
+ 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;
- my $container = $self->get_sub_container('component');
+ # FIXME - if we're getting from these containers, we need to either:
+ # - pass 'ctx' and 'accept_context_args' OR
+ # - make these params optional
+ 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;
- $components{$comp_name} = $comp;
+ for my $component ($container->get_service_list) {
+ my $comp_service = $container->get_service($component);
+
+ $components{$comp_service->catalyst_component_name} = $comp_service->get(ctx => $class);
+ }
}
return lock_hash %components;
return unless $type;
- my $component_service_name = "${type}_${name}";
-
# The 'component' sub-container will create the object, and store it's
# instance, which, by default, will live throughout the application.
# The model/view/controller sub-containers only reference the instance
my $instance_container = $self->get_sub_container('component');
my $accept_context_container = $self->get_sub_container($type);
+ # Custom containers might have added the service already
+ # We don't want to override that
+ return if $accept_context_container->has_service( $name );
+
+ my $component_service_name = "${type}_${name}";
+
$instance_container->add_service(
Catalyst::IOC::ConstructorInjection->new(
name => $component_service_name,
+ catalyst_component_name => $component,
class => $component,
lifecycle => 'Singleton',
dependencies => [
depends_on( '/application_name' ),
- depends_on( '/config' ),
],
)
- ) unless $instance_container->has_service( $component_service_name );
- # ^ custom containers might have added the service already.
- # we don't want to override that.
+ );
$accept_context_container->add_service(
Catalyst::IOC::BlockInjection->new(
name => $name,
+ catalyst_component_name => $component,
dependencies => [
depends_on( "/component/$component_service_name" ),
],
block => sub { shift->param($component_service_name) },
)
- ) unless $accept_context_container->has_service( $name );
- # ^ same as above
+ );
}
# FIXME: should this sub exist?
# or replaced by something already existing there?
sub _get_component_type_name {
my ( $component ) = @_;
+ my $result;
- my @parts = split /::/, $component;
-
- while (scalar @parts > 1) {
- my $type = shift @parts;
-
- return ('controller', join '::', @parts)
- if $type =~ /^(c|controller)$/i;
-
- return ('model', join '::', @parts)
- if $type =~ /^(m|model)$/i;
-
- return ('view', join '::', @parts)
- if $type =~ /^(v|view)$/i;
+ while ( !$result and (my $index = index $component, '::') > 0 ) {
+ my $type = lc substr $component, 0, $index;
+ $component = substr $component, $index + 2;
+ $result = first { $type eq $_ or $type eq substr($_, 0, 1) }
+ qw{ model view controller };
}
- return (undef, $component);
+ return ($result, $component);
}
sub expand_component_module {
return Devel::InnerPackage::list_packages( $module );
}
-# copied from stevan's OX
-sub flush_request_services {
- my $self = shift;
- my @services = $self->get_service_list;
-
- foreach my $service (@services) {
- my $injection = $self->get_service($service);
- if ($injection->does('Catalyst::IOC::LifeCycle::Request')) {
- $injection->flush_instance;
- }
- }
-}
-
1;
__END__
$name is a regexp, it returns an array of matching components. Otherwise, it
looks for the component with name $name.
-=head2 get_components_names_types
-
-Gets all components from all containers and returns them as an array of
-arrayrefs containing the component name and the component type (i.e., whether
-it's an instance or a class).
-
=head2 get_all_components
Fetches all the components, in each of the sub_containers model, view and
Searches for components in all containers. If $component is the full class
name, the subcontainer is guessed, and it gets the searched component in there.
Otherwise, it looks for a component with that name in all subcontainers. If
-$component is a regexp, it calls the method below, find_component_regexp,
-and matches all components against that regexp.
-
-=head2 find_component_regexp
-
-Finds components that match a given regexp. Used internally, by find_component.
+$component is a regexp it calls _find_component_regexp and matches all
+components against that regexp.
=head2 expand_component_module
Components found by C<locate_components> will be passed to this method, which
is expected to return a list of component (package) names to be set up.
-=head2 flush_request_services
-
=head2 setup_components
=head1 AUTHORS