diff options
Diffstat (limited to 'lib/Bread/Board/Declare/Meta/Role/Attribute/Container.pm')
-rw-r--r-- | lib/Bread/Board/Declare/Meta/Role/Attribute/Container.pm | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/lib/Bread/Board/Declare/Meta/Role/Attribute/Container.pm b/lib/Bread/Board/Declare/Meta/Role/Attribute/Container.pm new file mode 100644 index 0000000..90d027d --- /dev/null +++ b/lib/Bread/Board/Declare/Meta/Role/Attribute/Container.pm @@ -0,0 +1,75 @@ +package Bread::Board::Declare::Meta::Role::Attribute::Container; +use Moose::Role; +Moose::Util::meta_attribute_alias('Container'); + +use Class::Load 'load_class'; + +has dependencies => ( + is => 'ro', + isa => 'Bread::Board::Service::Dependencies', + coerce => 1, + predicate => 'has_dependencies', +); + +after attach_to_class => sub { + my $self = shift; + + my $tc = $self->type_constraint; + if ($tc && $tc->isa('Moose::Meta::TypeConstraint::Class')) { + load_class($tc->class); + confess "Subcontainers must inherit from Bread::Board::Container" + unless $tc->class->isa('Bread::Board::Container'); + } + else { + confess "Attributes for subcontainers must specify a class type constraint"; + } +}; + +around get_value => sub { + my $orig = shift; + my $self = shift; + my ($instance) = @_; + + return $self->$orig($instance) + if $self->has_value($instance) + || $self->has_default + || $self->has_builder; + + my $val = $instance->get_sub_container($self->name); + + if ($self->has_type_constraint) { + $val = $self->type_constraint->coerce($val) + if $self->should_coerce; + + $self->verify_against_type_constraint($val, instance => $instance); + } + + return $val; +}; + +around _inline_instance_get => sub { + my $orig = shift; + my $self = shift; + my ($instance) = @_; + return 'do {' . "\n" + . 'my $val;' . "\n" + . 'if (' . $self->_inline_instance_has($instance) . ') {' . "\n" + . '$val = ' . $self->$orig($instance) . ';' . "\n" + . '}' . "\n" + . 'else {' . "\n" + . '$val = ' . $instance . '->get_sub_container(\'' . $self->name . '\');' . "\n" + . join("\n", $self->_inline_check_constraint( + '$val', + '$type_constraint', + (Moose->VERSION >= 2.0100 + ? '$type_message' + : '$type_constraint_obj'), + )) . "\n" + . '}' . "\n" + . '$val' . "\n" + . '}'; +}; + +no Moose::Role; + +1; |