# HG changeset patch # User cin # Date 1385654420 -14400 # Node ID 715b9959b207519198ab186bcfddabc4c09429ad # Parent eff7f75a4408aab55f262d1de18f26748b744ad0 WebView: initial work on metadata providers diff -r eff7f75a4408 -r 715b9959b207 Lib/IMPL/Web/View/Metadata.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Web/View/Metadata.pm Thu Nov 28 20:00:20 2013 +0400 @@ -0,0 +1,50 @@ +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 eff7f75a4408 -r 715b9959b207 Lib/IMPL/Web/View/Metadata/FormMeta.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Web/View/Metadata/FormMeta.pm Thu Nov 28 20:00:20 2013 +0400 @@ -0,0 +1,58 @@ +package IMPL::Web::View::Metadata::FormMeta; +use strict; + +ues IMPL::Const qw(:prop); +use IMPL::declare { + base => [ + 'IMPL::Object' => undef + ], + props => [ + decl => PROP_RO, + schema => PROP_RO, + nodes => PROP_RO, + errors => PROP_RO + ] +}; + + + +1; + +__END__ + +=pod + +=head1 NAME + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +Метаданные по модели, являющейся частью формы. Элемент формы описывается +несколькими компонентами: + +=over + +=item * schema + +Схема текущего элемента, СomlexType, SimpleType, ComplexNode или SimpleNode + +=item * decl + +Сам элемент формы, который присутствует в родительском контейнере. Объявление +может совпадать со схемой в случае, когда это был SimpleNode или ComplexNode, +иначе это Node ссылающийся на заранее обпределенный тип. + +=item * nodes + +Список узлов документа, которые являются экземплярами текущего элемента, в +случае, если этот элемен не является множественным (maxOccur=1), тогда здесь +должен быть только один элемент. + +=item * errors + +Список ошибок относящихся к данному элементу. + +=back + +=cut \ No newline at end of file diff -r eff7f75a4408 -r 715b9959b207 Lib/IMPL/Web/View/Metadata/ObjectProvider.pm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Web/View/Metadata/ObjectProvider.pm Thu Nov 28 20:00:20 2013 +0400 @@ -0,0 +1,48 @@ +package IMPL::Web::View::Metadata::ObjectProvider; +use strict; + +use IMPL::lang; +use IMPL::declare { + require => { + Exception => 'IMPL::Exception', + ArgException => '-IMPL::InvalidArgumentException', + Meta => 'IMPL::Web::View::Metadata', + PropertyInfo => 'IMPL::Class::PropertyInfo' + }, + base => [ + 'IMPL::Object' => undef + ] +}; + +sub GetMetadata { + my ($this,$model) = @_; + + my $class = typeof($model) || $model; + + return Meta->new( + type => $class, + provider => $this + ); +} + +# returns array of metadata +sub GetFields { + my ($this,$class) = @_; + + my %seen; + + return map { + my %meta = ( + provider => $this + ); + + $meta{type} = $_->type if $_->type; + + # TODO extend from metadata and external providers + + return Meta->new(%meta); + } $class->GetMeta(PropertyInfo, sub { $seen{$_->name} ? 0 : ($seen{$_->name} = 1) } , 1); + +} + +1; \ No newline at end of file diff -r eff7f75a4408 -r 715b9959b207 Lib/IMPL/Web/View/TemplateView.pm --- a/Lib/IMPL/Web/View/TemplateView.pm Wed Nov 27 17:12:38 2013 +0400 +++ b/Lib/IMPL/Web/View/TemplateView.pm Thu Nov 28 20:00:20 2013 +0400 @@ -1,6 +1,8 @@ package IMPL::Web::View::TemplateView; use strict; +use Carp qw(carp); + use IMPL::Const qw(:prop); use IMPL::declare { base => [ @@ -11,4 +13,8 @@ ] }; +sub CTOR { + carp "deprecated"; +} + 1; \ No newline at end of file