diff options
Diffstat (limited to 'lib/MooseX/Bread/Board/Meta/Role/Attribute.pm')
-rw-r--r-- | lib/MooseX/Bread/Board/Meta/Role/Attribute.pm | 185 |
1 files changed, 0 insertions, 185 deletions
diff --git a/lib/MooseX/Bread/Board/Meta/Role/Attribute.pm b/lib/MooseX/Bread/Board/Meta/Role/Attribute.pm deleted file mode 100644 index 2622e84..0000000 --- a/lib/MooseX/Bread/Board/Meta/Role/Attribute.pm +++ /dev/null @@ -1,185 +0,0 @@ -package MooseX::Bread::Board::Meta::Role::Attribute; -use Moose::Role; -Moose::Util::meta_attribute_alias('Service'); - -use Bread::Board::Types; -use List::MoreUtils qw(any); - -use MooseX::Bread::Board::BlockInjection; -use MooseX::Bread::Board::ConstructorInjection; -use MooseX::Bread::Board::Literal; - -has service => ( - is => 'ro', - isa => 'Bool', - default => 1, -); - -has block => ( - is => 'ro', - isa => 'CodeRef', - predicate => 'has_block', -); - -# has_value is already a method -has literal_value => ( - is => 'ro', - isa => 'Str|CodeRef', - init_arg => 'value', - predicate => 'has_literal_value', -); - -has lifecycle => ( - is => 'ro', - isa => 'Str', - predicate => 'has_lifecycle', -); - -has dependencies => ( - is => 'ro', - isa => 'Bread::Board::Service::Dependencies', - coerce => 1, - predicate => 'has_dependencies', -); - -has constructor_name => ( - is => 'ro', - isa => 'Str', - predicate => 'has_constructor_name', -); - -has associated_service => ( - is => 'rw', - isa => 'Bread::Board::Service', - predicate => 'has_associated_service', -); - -after attach_to_class => sub { - my $self = shift; - - return unless $self->service; - - my %params = ( - associated_attribute => $self, - name => $self->name, - ($self->has_lifecycle - ? (lifecycle => $self->lifecycle) - : ()), - ($self->has_dependencies - ? (dependencies => $self->dependencies) - : ()), - ($self->has_constructor_name - ? (constructor_name => $self->constructor_name) - : ()), - ); - - my $service; - if ($self->has_block) { - $service = MooseX::Bread::Board::BlockInjection->new( - %params, - block => $self->block, - ); - } - elsif ($self->has_literal_value) { - $service = MooseX::Bread::Board::Literal->new( - %params, - value => $self->literal_value, - ); - } - elsif ($self->has_type_constraint) { - my $tc = $self->type_constraint; - if ($tc->isa('Moose::Meta::TypeConstraint::Class')) { - $service = MooseX::Bread::Board::ConstructorInjection->new( - %params, - class => $tc->class, - ); - } - } - - $self->associated_service($service) if $service; -}; - -after _process_options => sub { - my $class = shift; - my ($name, $opts) = @_; - - return unless exists $opts->{default} - || exists $opts->{builder}; - return unless exists $opts->{class} - || exists $opts->{block} - || exists $opts->{value}; - - # XXX: uggggh - return if any { $_ eq 'Moose::Meta::Attribute::Native::Trait::String' - || $_ eq 'Moose::Meta::Attribute::Native::Trait::Counter' } - @{ $opts->{traits} }; - - my $exists = exists($opts->{default}) ? 'default' : 'builder'; - die "$exists is not valid when Bread::Board service options are set"; -}; - -around get_value => sub { - my $orig = shift; - my $self = shift; - my ($instance) = @_; - - return $self->$orig($instance) - if $self->has_value($instance); - - my $val = $instance->get_service($self->name)->get; - - $self->verify_against_type_constraint($val, instance => $instance) - if $self->has_type_constraint; - - if ($self->should_auto_deref) { - if (ref($val) eq 'ARRAY') { - return wantarray ? @$val : $val; - } - elsif (ref($val) eq 'HASH') { - return wantarray ? %$val : $val; - } - else { - die 'XXX'; - } - } - else { - return $val; - } -}; - -if (Moose->VERSION > 1.9900) { - 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_service(\'' . $self->name . '\')->get;' . "\n" - . $self->_inline_check_constraint( - '$val', '$type_constraint', '$type_constraint_obj' - ) - . '}' . "\n" - . '$val' . "\n" - . '}'; - }; -} -else { - around accessor_metaclass => sub { - my $orig = shift; - my $self = shift; - - return Moose::Meta::Class->create_anon_class( - superclasses => [ $self->$orig(@_) ], - roles => [ 'MooseX::Bread::Board::Meta::Role::Accessor' ], - cache => 1 - )->name; - }; -} - -no Moose::Role; - -1; |