Mercurial > pub > Impl
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 |