| 364 | 1 package IMPL::Web::View::Metadata::BaseMeta; | 
| 363 | 2 use strict; | 
|  | 3 | 
| 364 | 4 use IMPL::lang; | 
| 363 | 5 use IMPL::Const qw(:prop); | 
|  | 6 use IMPL::declare { | 
| 364 | 7 	require => { | 
|  | 8 		Exception => 'IMPL::Exception', | 
|  | 9 		ArgException => '-IMPL::InvalidArgumentException' | 
|  | 10 	}, | 
| 363 | 11 	base => [ | 
|  | 12 		'IMPL::Object' => undef | 
|  | 13 	], | 
|  | 14 	props => [ | 
| 364 | 15 		model => PROP_RO, | 
|  | 16 		modelType => PROP_RO, | 
|  | 17 		provider => PROP_RO, | 
|  | 18 		name => PROP_RO, | 
|  | 19 		label => PROP_RO, | 
|  | 20 		container => PROP_RO, | 
|  | 21 		template => PROP_RO, | 
|  | 22 | 
|  | 23 		_childMap => PROP_RO, | 
|  | 24 		_childNames => PROP_RO | 
| 363 | 25 	] | 
|  | 26 }; | 
|  | 27 | 
|  | 28 sub CTOR { | 
| 364 | 29 	my ($this,$provider,$model,$type,$args) = @_; | 
|  | 30 | 
|  | 31 	$type ||= typeof($model); | 
|  | 32 | 
|  | 33 	die ArgException->new(provider => 'A provider must be specified'); | 
| 363 | 34 | 
| 364 | 35 	$this->provider($provider); | 
|  | 36 	$this->model($model); | 
|  | 37 	$this->modelType($type); | 
|  | 38 	$this->childMap({}); | 
|  | 39 | 
|  | 40 	#mixin other args | 
|  | 41 	if ($args) { | 
|  | 42 		$this->$_($args->{$_}) foreach grep $args->{$_}, qw(name label container template); | 
|  | 43 	} | 
| 363 | 44 } | 
|  | 45 | 
|  | 46 sub GetChild { | 
|  | 47 	my ($this,$name) = @_; | 
| 364 | 48 | 
|  | 49 	if(my $child = $this->_childMap->{$name}) { | 
|  | 50 		return $child; | 
|  | 51 	} else { | 
|  | 52 		return $this->_childMap->{$name} = $this->provider->GetChild($this,$name); | 
|  | 53 	} | 
|  | 54 } | 
|  | 55 | 
|  | 56 sub GetChildren { | 
|  | 57 	my ($this) = @_; | 
|  | 58 | 
|  | 59 	if ($this->_childNames) { | 
|  | 60 		return [ map $this->_childMap->{$_}, @{$this->_childNames} ]; | 
|  | 61 	} else { | 
|  | 62 		my @childNames; | 
|  | 63 		my %childMap; | 
|  | 64 		my @result; | 
|  | 65 | 
|  | 66 		foreach my $child (@{$this->provider->PopulateChildren($this)}) { | 
|  | 67 			$childMap{$child->name} = $child; | 
|  | 68 			push @childNames, $child->name; | 
|  | 69 			push @result, $child; | 
|  | 70 		} | 
|  | 71 | 
|  | 72 		$this->_childMap(\%childMap); | 
|  | 73 		$this->_childNames(\@childNames); | 
|  | 74 		return \@result; | 
|  | 75 	} | 
| 363 | 76 } | 
|  | 77 | 
|  | 78 1; | 
|  | 79 | 
|  | 80 __END__ | 
|  | 81 | 
|  | 82 =pod | 
|  | 83 | 
|  | 84 =head1 NAME | 
|  | 85 | 
|  | 86 =head1 SYNOPSIS | 
|  | 87 | 
|  | 88 =head1 DESCRIPTION | 
|  | 89 | 
|  | 90 Метаданные описывают модель, ее свойства, используются для построения | 
|  | 91 представления. | 
|  | 92 | 
|  | 93 =over | 
|  | 94 | 
|  | 95 =item * type | 
|  | 96 | 
|  | 97 Опционально. Тип модели. В случаях, когда модель не определена, данное свойство | 
|  | 98 позволяет определить ее тип. | 
|  | 99 | 
|  | 100 =item * label | 
|  | 101 | 
|  | 102 Опционально. Имя модели для отображения. | 
|  | 103 | 
|  | 104 =item * template | 
|  | 105 | 
|  | 106 Шаблон, который следует использовать для отображения модели. | 
|  | 107 | 
|  | 108 =item * fields | 
|  | 109 | 
|  | 110 Коллекция с информацией по свойствам (полям) модели. Данный хеш используется | 
|  | 111 для определения представления при использовании C<display_for('field')>. | 
|  | 112 | 
|  | 113 =back | 
|  | 114 | 
|  | 115 Метаданные публикуются провайдером, кроме того они могут быть расширены | 
|  | 116 дополнительными свойствами. | 
|  | 117 | 
| 364 | 118 =head1 MEMBERS | 
|  | 119 | 
|  | 120 =head2 C<GetChild($name)> | 
|  | 121 | 
|  | 122 Возвращает метаданные для дочернего элемента, например свойства объекта | 
|  | 123 | 
|  | 124 =head2 C<GetChildren()> | 
|  | 125 | 
|  | 126 Возвращает ссылку на массив с метаданными для дочерних элементов | 
|  | 127 | 
| 363 | 128 =cut |