changeset 364:82b6c967bcf1

sync, working on metadata
author cin
date Fri, 29 Nov 2013 16:33:07 +0400
parents d67e45705be5
children 7c621bb95e53
files Lib/IMPL/Object/Abstract.pm Lib/IMPL/Web/View/Metadata.pm Lib/IMPL/Web/View/Metadata/BaseMeta.pm Lib/IMPL/Web/View/Metadata/FormMeta.pm Lib/IMPL/Web/View/Metadata/FormProvider.pm Lib/IMPL/Web/View/Metadata/Meta.pm
diffstat 6 files changed, 175 insertions(+), 115 deletions(-) [+]
line wrap: on
line diff
--- 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;
--- 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<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/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<display_for('field')>.
+
+=back
+
+Метаданные публикуются провайдером, кроме того они могут быть расширены
+дополнительными свойствами.
+
+=head1 MEMBERS
+
+=head2 C<GetChild($name)>
+
+Возвращает метаданные для дочернего элемента, например свойства объекта
+
+=head2 C<GetChildren()>
+
+Возвращает ссылку на массив с метаданными для дочерних элементов
+
+=cut
\ No newline at end of file
--- 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;
--- /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
--- 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<display_for('field')>.
-
-=back
-
-Метаданные публикуются провайдером, кроме того они могут быть расширены
-дополнительными свойствами.
-
-=cut
\ No newline at end of file