Mercurial > pub > Impl
diff Lib/IMPL/Web/View/Metadata/ObjectMeta.pm @ 369:7c784144d2f1
Implemented object metadata class, cleanup
author | cin |
---|---|
date | Mon, 09 Dec 2013 17:35:34 +0400 |
parents | |
children | cbf4febf0930 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Web/View/Metadata/ObjectMeta.pm Mon Dec 09 17:35:34 2013 +0400 @@ -0,0 +1,109 @@ +package IMPL::Web::View::Metadata::FormMeta; +use strict; + +use IMPL::Const qw(:prop); +use IMPL::declare { + require => { + Exception => 'IMPL::Exception', + ArgException => '-IMPL::InvalidArgumentException', + OpException => '-IMPL::InvalidOperationException', + PropertyInfo => 'IMPL::Class::PropertyInfo', + AbstractObject => '-IMPL::Object::Abstract' + }, + base => [ + 'IMPL::Web::View::Metadata::BaseMeta' => '@_' + ], + props => [ + isMultiple => PROP_RO, + holdingType => PROP_RO + ] +}; + +use constant { + Meta => __PACKAGE__ +}; + +sub CTOR { + my ($this,$model,$type,$args) = @_; + + $type ||= typeof($model); + $args->{isMultiple} ||= $type eq 'ARRAY'; + + if ($args) { + $this->$_($args->{$_}) foreach grep $args->{$_}, qw(isMultiple holdingType); + } +} + +sub PopulateProperties { + my ($this) = @_; + + my %seen; + my @props; + + my $modelType = $this->modelType; + + if ( isclass($modelType,AbstractObject) ) { + foreach my $pi ($this->modelType->GetMeta(PropertyInfo, sub { not($seen{$_}++) }, 1)) { + my $pv = $pi->getter->($this->model); + my $pt; + + my %args = (name => $pi->name); + if ($pi->isList) { + $pt = 'ARRAY'; + $args{isMultiple} = 1; + $args{holdingType} = $pi->type; + } else { + $pt = $pi->type; + } + + push @props, Meta->new($pv, $pt, \%args); + } + } elsif ( $modelType eq 'HASH' ) { + while ( my ($k,$v) = each %{$this->model || {}} ) { + push @props, Meta->new($v,undef,{name => $k}); + } + } + + return \@props; +} + +sub GetItems { + my ($this) = @_; + + die OpException->new("The operation must be performed on the container") + unless $this->isMultiple; + + my $i = 0; + + return [ + map $this->_GetItemMeta($_,$i++), @{$this->model || []} + ]; +} + +sub GetItem { + my ($this,$index) = @_; + + die OpException->new("The operation must be performed on the container") + unless $this->isMultiple; + + my $item = @{$this->model || []}[$index]; + + return $this->_GetItemMeta($item,$index); +} + +sub _GetItemMeta { + my ($this,$item,$index) = @_; + + return Meta->new( + $item, + $this->holdingType, + { + name => $index, + container => $this + } + ); +} + +1; + +__END__