From 1d668665354678a7c9f95e5eb97ae0e27c62cd4c Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Fri, 15 Apr 2011 23:52:31 -0500 Subject: get auto-inferring services working --- lib/Bread/Board/Declare/Role/Object.pm | 25 ++++++++++++++ t/50-infer.t | 59 ++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 t/50-infer.t diff --git a/lib/Bread/Board/Declare/Role/Object.pm b/lib/Bread/Board/Declare/Role/Object.pm index 505d87b..7ed647e 100644 --- a/lib/Bread/Board/Declare/Role/Object.pm +++ b/lib/Bread/Board/Declare/Role/Object.pm @@ -25,6 +25,31 @@ after BUILD => sub { ) ); } + elsif ($service->isa('Bread::Board::Declare::ConstructorInjection') + && (my $meta = Class::MOP::class_of($service->class))) { + my $inferred = Bread::Board::Service::Inferred->new( + current_container => $self, + )->infer_service($service->class); + + my %deps = ( + %{ $inferred->dependencies }, + %{ $service->dependencies }, + ); + + my $type_service = $inferred->clone( + dependencies => \%deps, + ); + + $self->add_service($type_service); + $self->add_type_mapping_for($service->class, $type_service); + + $self->add_service( + Bread::Board::Service::Alias->new( + name => $service->name, + aliased_from_path => $type_service->name, + ) + ); + } else { $self->add_service($service->clone); } diff --git a/t/50-infer.t b/t/50-infer.t new file mode 100644 index 0000000..d3bd1cc --- /dev/null +++ b/t/50-infer.t @@ -0,0 +1,59 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Test::More; + +{ + package Foo; + use Moose; +} + +{ + package Bar; + use Moose; +} + +{ + package Baz; + use Moose; + + has foo => ( + is => 'ro', + isa => 'Foo', + required => 1, + ); + + has bar => ( + is => 'ro', + isa => 'Bar', + required => 1, + ); +} + +{ + package My::Container; + use Moose; + use Bread::Board::Declare; + + has foo => ( + is => 'ro', + isa => 'Foo', + ); + + has bar => ( + is => 'ro', + isa => 'Bar', + ); + + has baz => ( + is => 'ro', + isa => 'Baz', + ); +} + +my $c = My::Container->new; +isa_ok($c->baz, 'Baz'); +isa_ok($c->baz->foo, 'Foo'); +isa_ok($c->baz->bar, 'Bar'); + +done_testing; -- cgit v1.2.3-54-g00ecf