diff options
-rw-r--r-- | lib/MooseX/Bread/Board/Meta/Role/Class.pm | 17 | ||||
-rw-r--r-- | lib/MooseX/Bread/Board/Role/Object.pm | 4 | ||||
-rw-r--r-- | t/20-inheritance.t | 108 |
3 files changed, 127 insertions, 2 deletions
diff --git a/lib/MooseX/Bread/Board/Meta/Role/Class.pm b/lib/MooseX/Bread/Board/Meta/Role/Class.pm index 652d0b7..9cabd88 100644 --- a/lib/MooseX/Bread/Board/Meta/Role/Class.pm +++ b/lib/MooseX/Bread/Board/Meta/Role/Class.pm @@ -2,6 +2,7 @@ package MooseX::Bread::Board::Meta::Role::Class; use Moose::Role; use Bread::Board::Service; +use List::MoreUtils qw(any); has services => ( traits => ['Array'], @@ -14,6 +15,22 @@ has services => ( }, ); +sub has_any_services { + my $self = shift; + return any { $_->has_services } + grep { Moose::Util::does_role($_, __PACKAGE__) } + map { $_->meta } + $self->linearized_isa; +} + +sub get_all_services { + my $self = shift; + return map { $_->services } + grep { Moose::Util::does_role($_, __PACKAGE__) } + map { $_->meta } + $self->linearized_isa; +} + no Moose::Role; 1; diff --git a/lib/MooseX/Bread/Board/Role/Object.pm b/lib/MooseX/Bread/Board/Role/Object.pm index e25fdf5..8846792 100644 --- a/lib/MooseX/Bread/Board/Role/Object.pm +++ b/lib/MooseX/Bread/Board/Role/Object.pm @@ -14,9 +14,9 @@ after BUILD => sub { my $self = shift; my $meta = Class::MOP::class_of($self); - return unless $meta->has_services; + return unless $meta->has_any_services; - for my $service ($meta->services) { + for my $service ($meta->get_all_services) { if ($service->isa('MooseX::Bread::Board::BlockInjection')) { my $block = $service->block; $self->add_service( diff --git a/t/20-inheritance.t b/t/20-inheritance.t new file mode 100644 index 0000000..d08b82a --- /dev/null +++ b/t/20-inheritance.t @@ -0,0 +1,108 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use Test::More; + +{ + package Parent; + use Moose; + use MooseX::Bread::Board; + + has foo => ( + is => 'ro', + isa => 'Str', + value => 'FOO', + ); + + has bar => ( + is => 'ro', + isa => 'Str', + block => sub { + my $s = shift; + return $s->param('foo') . 'BAR'; + }, + dependencies => ['foo'], + ); +} + +{ + package Child; + use Moose; + use MooseX::Bread::Board; + + extends 'Parent'; + + has baz => ( + is => 'ro', + isa => 'Str', + value => 'BAZ', + ); + + has quux => ( + is => 'ro', + isa => 'Str', + block => sub { + my $s = shift; + return $s->param('foo') + . $s->param('bar') + . $s->param('baz') + . 'QUUX'; + }, + dependencies => ['foo', 'bar', 'baz'], + ); +} + +{ + my $parent = Parent->new; + isa_ok($parent, 'Bread::Board::Container'); + is($parent->foo, 'FOO'); + is($parent->bar, 'FOOBAR'); +} + +{ + my $parent = Parent->new(foo => 'OOF', bar => 'RAB'); + isa_ok($parent, 'Bread::Board::Container'); + is($parent->foo, 'OOF'); + is($parent->bar, 'RAB'); +} + +{ + my $parent = Parent->new(foo => 'OOF'); + isa_ok($parent, 'Bread::Board::Container'); + is($parent->foo, 'OOF'); + is($parent->bar, 'OOFBAR'); +} + +{ + my $child = Child->new; + is($child->foo, 'FOO'); + is($child->bar, 'FOOBAR'); + is($child->baz, 'BAZ'); + is($child->quux, 'FOOFOOBARBAZQUUX'); +} + +{ + my $child = Child->new( + foo => 'OOF', + bar => 'RAB', + baz => 'ZAB', + quux => 'XUUQ', + ); + is($child->foo, 'OOF'); + is($child->bar, 'RAB'); + is($child->baz, 'ZAB'); + is($child->quux, 'XUUQ'); +} + +{ + my $child = Child->new( + foo => 'OOF', + baz => 'ZAB', + ); + is($child->foo, 'OOF'); + is($child->bar, 'OOFBAR'); + is($child->baz, 'ZAB'); + is($child->quux, 'OOFOOFBARZABQUUX'); +} + +done_testing; |