changeset 362:715b9959b207

WebView: initial work on metadata providers
author cin
date Thu, 28 Nov 2013 20:00:20 +0400
parents eff7f75a4408
children d67e45705be5
files Lib/IMPL/Web/View/Metadata.pm Lib/IMPL/Web/View/Metadata/FormMeta.pm Lib/IMPL/Web/View/Metadata/ObjectProvider.pm Lib/IMPL/Web/View/TemplateView.pm
diffstat 4 files changed, 162 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /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<display_for('field')>.
+
+=back
+
+Метаданные публикуются провайдером, кроме того они могут быть расширены
+дополнительными свойствами.
+
+=cut
\ No newline at end of file
--- /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
--- /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
--- 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