Mercurial > pub > Impl
view lib/IMPL/Config/ReferenceDescriptor.pm @ 425:c27434cdd611 ref20150831
sync
author | cin |
---|---|
date | Tue, 03 Apr 2018 19:30:01 +0300 |
parents | b0481c071bea |
children |
line wrap: on
line source
package IMPL::Config::ReferenceDescriptor; use strict; use IMPL::Exception(); use IMPL::declare { base => [ 'IMPL::Object' => undef, 'IMPL::Config::Descriptor' => undef ], props => [ reference => 'ro', services => 'ro', lazy => 'ro', optional => 'ro', default => 'ro', _name => 'rw' ] }; sub CTOR { my ( $this, $ref, %opts ) = @_; $this->reference($ref) or die IMPL::InvalidArgumentException->new('ref'); $this->lazy( $opts{lazy} ) if $opts{lazy}; $this->optional( $opts{optional} ) if $opts{optional}; $this->default( $opts{default} ) if $opts{optional} and exists $opts{default}; $this->_name( 'ref ' . $ref ); } sub Activate { my ( $this, $context ) = @_; my $ref = $this->reference; my %opts; my $inst; if ( $this->optional ) { $opts{optional} = 1; $opts{default} = $this->default; } if ( $this->lazy ) { my $clone = $context->Clone(); return sub { $clone->Resolve( $ref, %opts ); }; } else { return $context->Resolve( $ref, %opts ); } } 1; __END__ =pod =head1 NAME C<IMPL::Config::ReferenceDescriptor> - A descriptor which is points to the other service =head1 MEMBERS =head2 PROPS =head3 reference =head3 lazy =head3 optional =head3 default =head2 METHODS =head3 CTOR($ref, %opts) =head3 Activate($context) Returns a result of the activation of the service specified by the C<reference> property. If the reference is lazy the method returns a closure.The C<$context> will be cloned and the clone will be used to create the closure. =cut