comparison Lib/IMPL/Web/View/Metadata/BaseMeta.pm @ 364:82b6c967bcf1

sync, working on metadata
author cin
date Fri, 29 Nov 2013 16:33:07 +0400
parents Lib/IMPL/Web/View/Metadata/Meta.pm@d67e45705be5
children 935629bf80df
comparison
equal deleted inserted replaced
363:d67e45705be5 364:82b6c967bcf1
1 package IMPL::Web::View::Metadata::BaseMeta;
2 use strict;
3
4 use IMPL::lang;
5 use IMPL::Const qw(:prop);
6 use IMPL::declare {
7 require => {
8 Exception => 'IMPL::Exception',
9 ArgException => '-IMPL::InvalidArgumentException'
10 },
11 base => [
12 'IMPL::Object' => undef
13 ],
14 props => [
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
25 ]
26 };
27
28 sub CTOR {
29 my ($this,$provider,$model,$type,$args) = @_;
30
31 $type ||= typeof($model);
32
33 die ArgException->new(provider => 'A provider must be specified');
34
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 }
44 }
45
46 sub GetChild {
47 my ($this,$name) = @_;
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 }
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
118 =head1 MEMBERS
119
120 =head2 C<GetChild($name)>
121
122 Возвращает метаданные для дочернего элемента, например свойства объекта
123
124 =head2 C<GetChildren()>
125
126 Возвращает ссылку на массив с метаданными для дочерних элементов
127
128 =cut