X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FIOC%2FContainer.pm;fp=lib%2FCatalyst%2FIOC%2FContainer.pm;h=040dc838ab2e0b5ac6c8e26deddf29acb8f8fa4d;hb=55f2f3992e638c23083924b46889afcfafca565f;hp=71bc69cc1ac909cdfaed9ec35be3ae331a9dba11;hpb=334eb9fb95e4355aa50632b0bd3584eeaf2b09f7;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/IOC/Container.pm b/lib/Catalyst/IOC/Container.pm index 71bc69c..040dc83 100644 --- a/lib/Catalyst/IOC/Container.pm +++ b/lib/Catalyst/IOC/Container.pm @@ -6,6 +6,7 @@ use Data::Visitor::Callback; use Catalyst::Utils (); use Hash::Util qw/lock_hash/; use MooseX::Types::LoadableClass qw/ LoadableClass /; +use Moose::Util; use Catalyst::IOC::BlockInjection; use namespace::autoclean; @@ -523,9 +524,7 @@ sub get_all_components { } sub add_component { -# FIXME I'm aware it shouldn't be getting $instance as an argument -# and that setup_component should be removed. This is temporary - my ( $self, $component, $instance ) = @_; + my ( $self, $component, $class ) = @_; my ( $type, $name ) = _get_component_type_name($component); return unless $type; @@ -533,7 +532,7 @@ sub add_component { $self->get_sub_container($type)->add_service( Catalyst::IOC::BlockInjection->new( name => $name, - block => sub { $instance }, + block => sub { $self->setup_component( $component, $class ) }, ) ); } @@ -560,6 +559,48 @@ sub _get_component_type_name { return (undef, $component); } +# FIXME ugly and temporary +# Just moved it here the way it was, so we can work on it here in the container +sub setup_component { + my ( $self, $component, $class ) = @_; + + unless ( $component->can( 'COMPONENT' ) ) { + return $component; + } + + # FIXME I know this isn't the "Dependency Injection" way of doing things, + # its just temporary + my $suffix = Catalyst::Utils::class2classsuffix( $component ); + my $config = $self->resolve(service => 'config')->{ $suffix } || {}; + + # Stash catalyst_component_name in the config here, so that custom COMPONENT + # methods also pass it. local to avoid pointlessly shitting in config + # for the debug screen, as $component is already the key name. + local $config->{catalyst_component_name} = $component; + + my $instance = eval { $component->COMPONENT( $class, $config ); }; + + if ( my $error = $@ ) { + chomp $error; + Catalyst::Exception->throw( + message => qq/Couldn't instantiate component "$component", "$error"/ + ); + } + elsif (!blessed $instance) { + my $metaclass = Moose::Util::find_meta($component); + my $method_meta = $metaclass->find_method_by_name('COMPONENT'); + my $component_method_from = $method_meta->associated_metaclass->name; + my $value = defined($instance) ? $instance : 'undef'; + Catalyst::Exception->throw( + message => + qq/Couldn't instantiate component "$component", COMPONENT() method (from $component_method_from) didn't return an object-like value (value was $value)./ + ); + } + + return $instance; +} + + 1; __END__ @@ -671,6 +712,8 @@ Searches for components in all containers. If $component is the full class name, Finds components that match a given regexp. Used internally, by find_component. +=head2 setup_component + =head2 _fix_syntax =head2 _config_substitutions