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 /;
}
# 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 {
+sub _find_component_regexp {
my ( $self, $component, @args ) = @_;
my @result;
my $self = shift;
my %components;
- my $container = $self->get_sub_container('component');
+ foreach my $type (qw/model view controller /) {
+ my $container = $self->get_sub_container('component');
- 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 = $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
+ $components{$comp_name} = $comp;
+ }
}
return lock_hash %components;
# 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 {
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