Mercurial > pub > Impl
view Lib/IMPL/Code/DirectPropertyImplementor.pm @ 277:6585464c4664
sync (unstable)
author | sergey |
---|---|
date | Fri, 01 Feb 2013 16:37:59 +0400 |
parents | |
children | 4ddb27ff4a0b |
line wrap: on
line source
package IMPL::Code::DirectPropertyImplementor; use strict; use IMPL::require { Exception => 'IMPL::Exception', ArgException => '-IMPL::InvalidArgumentException' }; use parent qw(IMPL::Code::BasePropertyImplementor); use constant { CodeGetAccessor => 'return ($this->{$field});', CodeSetAccessor => 'return ($this->{$field} = $_[0])', CodeGetListAccessor => 'return( wantarray ? @{ $this->{$field} ? $this->{$field} : ( $this->{$field} = IMPL::Object::List->new() ) } : ( $this->{$field} ? $this->{$field} : ( $this->{$field} = IMPL::Object::List->new() ) ) );', CodeSetListAccessor => 'return( wantarray ? @{ $this->{$field} = IMPL::Object::List->new( (@_ == 1 and UNIVERSAL::isa($_[0], \'ARRAY\') ) ? $_[0] : [@_] )} : ($this->{$field} = IMPL::Object::List->new( (@_ == 1 and UNIVERSAL::isa($_[0], \'ARRAY\') ) ? $_[0] : [@_] )) );' }; sub factoryParams { qw($class $name $set $get $validator $field) }; my %cache; sub Implement { my ($self, $spec) = @_; my $name = $spec->{name} or ArgException->new(name => "The name of the property is required"); my $class = $spec->{class} or ArgException->new(name => "The onwer class must be specified"); $spec = $self->NormalizeSpecification($spec); my $id = $self->CreateFactoryId($spec); my $factory = $cache{$id}; unless($factory) { $factory = $self->CreateFactory($spec); $cache{$id} = $factory; } } 1;