# HG changeset patch # User cin # Date 1385728387 -14400 # Node ID 82b6c967bcf106a1778677d3fb061bece084b130 # Parent d67e45705be5317d1c7b000a49fd22c1be11ccfc sync, working on metadata diff -r d67e45705be5 -r 82b6c967bcf1 Lib/IMPL/Object/Abstract.pm --- a/Lib/IMPL/Object/Abstract.pm Fri Nov 29 11:04:19 2013 +0400 +++ b/Lib/IMPL/Object/Abstract.pm Fri Nov 29 16:33:07 2013 +0400 @@ -3,6 +3,7 @@ use warnings; use parent qw(IMPL::Class::Meta); +use Carp qw(croak); our $MemoryLeakProtection; my $Cleanup = 0; diff -r d67e45705be5 -r 82b6c967bcf1 Lib/IMPL/Web/View/Metadata.pm --- a/Lib/IMPL/Web/View/Metadata.pm Fri Nov 29 11:04:19 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -package IMPL::Web::View::Metadata; -use strict; - -use IMPL::declare { - base => [ - 'IMPL::Object' => undef - ] -}; - -1; - -__END__ - -=pod - -=head1 NAME - -=head1 SYNOPSIS - -=head1 DESCRIPTION - -Метаданные описывают модель, ее свойства, используются для построения -представления. - -=over - -=item * type - -Опционально. Тип модели. В случаях, когда модель не определена, данное свойство -позволяет определить ее тип. - -=item * label - -Опционально. Имя модели для отображения. - -=item * template - -Шаблон, который следует использовать для отображения модели. - -=item * fields - -Коллекция с информацией по свойствам (полям) модели. Данный хеш используется -для определения представления при использовании C. - -=back - -Метаданные публикуются провайдером, кроме того они могут быть расширены -дополнительными свойствами. - -=cut \ No newline at end of file diff -r d67e45705be5 -r 82b6c967bcf1 Lib/IMPL/Web/View/Metadata/BaseMeta.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Web/View/Metadata/BaseMeta.pm Fri Nov 29 16:33:07 2013 +0400 @@ -0,0 +1,128 @@ +package IMPL::Web::View::Metadata::BaseMeta; +use strict; + +use IMPL::lang; +use IMPL::Const qw(:prop); +use IMPL::declare { + require => { + Exception => 'IMPL::Exception', + ArgException => '-IMPL::InvalidArgumentException' + }, + base => [ + 'IMPL::Object' => undef + ], + props => [ + model => PROP_RO, + modelType => PROP_RO, + provider => PROP_RO, + name => PROP_RO, + label => PROP_RO, + container => PROP_RO, + template => PROP_RO, + + _childMap => PROP_RO, + _childNames => PROP_RO + ] +}; + +sub CTOR { + my ($this,$provider,$model,$type,$args) = @_; + + $type ||= typeof($model); + + die ArgException->new(provider => 'A provider must be specified'); + + $this->provider($provider); + $this->model($model); + $this->modelType($type); + $this->childMap({}); + + #mixin other args + if ($args) { + $this->$_($args->{$_}) foreach grep $args->{$_}, qw(name label container template); + } +} + +sub GetChild { + my ($this,$name) = @_; + + if(my $child = $this->_childMap->{$name}) { + return $child; + } else { + return $this->_childMap->{$name} = $this->provider->GetChild($this,$name); + } +} + +sub GetChildren { + my ($this) = @_; + + if ($this->_childNames) { + return [ map $this->_childMap->{$_}, @{$this->_childNames} ]; + } else { + my @childNames; + my %childMap; + my @result; + + foreach my $child (@{$this->provider->PopulateChildren($this)}) { + $childMap{$child->name} = $child; + push @childNames, $child->name; + push @result, $child; + } + + $this->_childMap(\%childMap); + $this->_childNames(\@childNames); + return \@result; + } +} + +1; + +__END__ + +=pod + +=head1 NAME + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +Метаданные описывают модель, ее свойства, используются для построения +представления. + +=over + +=item * type + +Опционально. Тип модели. В случаях, когда модель не определена, данное свойство +позволяет определить ее тип. + +=item * label + +Опционально. Имя модели для отображения. + +=item * template + +Шаблон, который следует использовать для отображения модели. + +=item * fields + +Коллекция с информацией по свойствам (полям) модели. Данный хеш используется +для определения представления при использовании C. + +=back + +Метаданные публикуются провайдером, кроме того они могут быть расширены +дополнительными свойствами. + +=head1 MEMBERS + +=head2 C + +Возвращает метаданные для дочернего элемента, например свойства объекта + +=head2 C + +Возвращает ссылку на массив с метаданными для дочерних элементов + +=cut \ No newline at end of file diff -r d67e45705be5 -r 82b6c967bcf1 Lib/IMPL/Web/View/Metadata/FormMeta.pm --- a/Lib/IMPL/Web/View/Metadata/FormMeta.pm Fri Nov 29 11:04:19 2013 +0400 +++ b/Lib/IMPL/Web/View/Metadata/FormMeta.pm Fri Nov 29 16:33:07 2013 +0400 @@ -3,8 +3,12 @@ use IMPL::Const qw(:prop); use IMPL::declare { + require => { + Exception => 'IMPL::Exception', + ArgException => '-IMPL::InvalidArgumentException' + }, base => [ - 'IMPL::Object' => undef + 'IMPL::Web::View::Metadata::BaseMeta' => '@_' ], props => [ decl => PROP_RO, @@ -14,6 +18,20 @@ ] }; +sub CTOR { + my ($this,$provider,$model,$type,$args) = @_; + + if ($args) { + $this->$_($args->{$_}) foreach grep $args->{$_}, qw(decl schema nodes errors); + } + + $this->$_() || die ArgException->new($_ => "The $_ is required") + foreach qw(decl schema); +} + +sub GetOwnErrors { + +} 1; diff -r d67e45705be5 -r 82b6c967bcf1 Lib/IMPL/Web/View/Metadata/FormProvider.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Web/View/Metadata/FormProvider.pm Fri Nov 29 16:33:07 2013 +0400 @@ -0,0 +1,27 @@ +package IMPL::Web::View::Metadata::FormProvider; +use strict; + +use IMPL::declare { + base => [ + 'IMPL::Object' => undef + ] +}; + +sub GetFormMetadata { + my ($this,$model, $form) = @_; +} + +sub PopulateChildren { + my ($this,$meta) = @_; + + map { + $_->name, + $_ + } $meta->schema->content->childNodes; +} + +sub GetChild { + +} + +1; \ No newline at end of file diff -r d67e45705be5 -r 82b6c967bcf1 Lib/IMPL/Web/View/Metadata/Meta.pm --- a/Lib/IMPL/Web/View/Metadata/Meta.pm Fri Nov 29 11:04:19 2013 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -package IMPL::Web::View::Metadata::Meta; -use strict; - -use IMPL::Const qw(:prop); -use IMPL::declare { - base => [ - 'IMPL::Object' => undef - ], - props => [ - type => PROP_RO, - provider => PROP_RO - ] -}; - -sub CTOR { - my ($this,$provider,$type) = @_; - -} - -sub GetChild { - my ($this,$name) = @_; -} - -1; - -__END__ - -=pod - -=head1 NAME - -=head1 SYNOPSIS - -=head1 DESCRIPTION - -Метаданные описывают модель, ее свойства, используются для построения -представления. - -=over - -=item * type - -Опционально. Тип модели. В случаях, когда модель не определена, данное свойство -позволяет определить ее тип. - -=item * label - -Опционально. Имя модели для отображения. - -=item * template - -Шаблон, который следует использовать для отображения модели. - -=item * fields - -Коллекция с информацией по свойствам (полям) модели. Данный хеш используется -для определения представления при использовании C. - -=back - -Метаданные публикуются провайдером, кроме того они могут быть расширены -дополнительными свойствами. - -=cut \ No newline at end of file