Mercurial > pub > Impl
comparison Lib/IMPL/Class/Meta.pm @ 180:d1676be8afcc
Перекодировка в utf-8
author | sourcer |
---|---|
date | Fri, 30 Dec 2011 23:40:00 +0300 |
parents | aaab45153411 |
children | 4d0e1962161c |
comparison
equal
deleted
inserted
replaced
179:b3d91ff7aea9 | 180:d1676be8afcc |
---|---|
8 | 8 |
9 sub set_meta { | 9 sub set_meta { |
10 my ($class,$meta_data) = @_; | 10 my ($class,$meta_data) = @_; |
11 $class = ref $class if ref $class; | 11 $class = ref $class if ref $class; |
12 | 12 |
13 # , | 13 # тут нельзя использовать стандартное исключение, поскольку для него используется |
14 # IMPL::Object::Accessor, | 14 # класс IMPL::Object::Accessor, который наследуется от текущего класса |
15 die "The meta_data parameter should be an object" if not ref $meta_data; | 15 die "The meta_data parameter should be an object" if not ref $meta_data; |
16 | 16 |
17 push @{$class_meta{$class}{ref $meta_data}},$meta_data; | 17 push @{$class_meta{$class}{ref $meta_data}},$meta_data; |
18 } | 18 } |
19 | 19 |
97 | 97 |
98 =pod | 98 =pod |
99 | 99 |
100 =head1 NAME | 100 =head1 NAME |
101 | 101 |
102 C<IMPL::Class::Meta> - . | 102 C<IMPL::Class::Meta> - информация хранимая на уровне класса. |
103 | 103 |
104 =head1 SYNOPSIS | 104 =head1 SYNOPSIS |
105 | 105 |
106 =begin code | 106 =begin code |
107 | 107 |
143 | 143 |
144 =end code | 144 =end code |
145 | 145 |
146 =head1 DESCRIPTION | 146 =head1 DESCRIPTION |
147 | 147 |
148 () , , | 148 Позвоялет расширять информацию о типах (класса) при помощи метаданных, метаданными являются любые объекты, |
149 (), . | 149 притом выборка метаданных приоизводится по их типу (классу), что позволяет выбрать все однотипные метаданные. |
150 | 150 |
151 | 151 Существует возможность выборки метаданных с учетом унаследованных от базовых классов |
152 | 152 |
153 =head1 MEMBERS | 153 =head1 MEMBERS |
154 | 154 |
155 =over | 155 =over |
156 | 156 |
157 =item C<set_meta($meta_data)> | 157 =item C<set_meta($meta_data)> |
158 | 158 |
159 C<$meta_data> . | 159 Добавляет метаданные C<$meta_data> к классу. |
160 | 160 |
161 =item C<get_meta($meta_class,$predicate,$deep)> | 161 =item C<get_meta($meta_class,$predicate,$deep)> |
162 | 162 |
163 C<$meta_class> , | 163 Выбирает метаданные типа C<$meta_class> и его наследников, с возможностью фильтрации и получения |
164 . | 164 метаданных базовых классов. |
165 | 165 |
166 =over | 166 =over |
167 | 167 |
168 =item C<$meta_class> | 168 =item C<$meta_class> |
169 | 169 |
170 | 170 Тип метаданных |
171 | 171 |
172 =item C<$predicate> | 172 =item C<$predicate> |
173 | 173 |
174 , | 174 Подпрограмма, которая будет вызываться для каждых найденных метаданных и на основе результата |
175 . | 175 ее выполнения метаданные будут включены в результат или нет. Получеат в качестве параметра |
176 , C<true> - , C<false> - | 176 объект с метаданными, возвращает C<true> - включить метаданные в результа, C<false> - пропустить |
177 . C<$_> . | 177 метаданные как не подходящие. Также переменная C<$_> ссылается на текущий объект с метаданными. |
178 | 178 |
179 =begin code | 179 =begin code |
180 | 180 |
181 my @info = Foo->get_meta( | 181 my @info = Foo->get_meta( |
182 'InfoMeta', | 182 'InfoMeta', |
195 | 195 |
196 =end code | 196 =end code |
197 | 197 |
198 =item C<$deep> | 198 =item C<$deep> |
199 | 199 |
200 . | 200 Осуществлять поиск по базовым классам. |
201 | 201 |
202 =back | 202 =back |
203 | 203 |
204 =item C<class_data($name,$new_value)> | 204 =item C<class_data($name,$new_value)> |
205 | 205 |
206 , C<class_data> , | 206 В отличии от метаданных, C<class_data> не накапливает информацию, |
207 C<$name>. | 207 а хранит только один экземпляр для одного ключа C<$name>. |
208 | 208 |
209 , , | 209 Если новое значение не задано, то осуществляется выборка сохраненного, |
210 , | 210 если текущий класс не имеет сохраненного значения, то оно ищется в базовых |
211 , | 211 классах, затем копия найденного значения сохраняется в текущем классе и |
212 . -, | 212 возвращается наружу. Это позволяет базовым классам задавать значение по-умолчанию, |
213 . | 213 которые могут быть изменены или заменены субклассами. |
214 | 214 |
215 =begin code | 215 =begin code |
216 | 216 |
217 package Foo; | 217 package Foo; |
218 use parent qw(IMPL::Class::Meta); | 218 use parent qw(IMPL::Class::Meta); |
238 | 238 |
239 =end code | 239 =end code |
240 | 240 |
241 =item C<static_accessor($name[,$value])> | 241 =item C<static_accessor($name[,$value])> |
242 | 242 |
243 C<$name> C<$value>. | 243 Создает статическое свойство с именем C<$name> и начальным значением C<$value>. |
244 | 244 |
245 C<class_data>, | 245 Использование данного свойство аналогично использованию C<class_data>, за исключением |
246 , C<class_data> , , | 246 того, что C<class_data> гарантирует, что наследник обладает собственной копией данных, |
247 , . | 247 изменение которых не коснется ни базового класса, ни соседей. |
248 | 248 |
249 =begin code | 249 =begin code |
250 | 250 |
251 package Foo; | 251 package Foo; |
252 use parent qw(IMPL::Class::Meta); | 252 use parent qw(IMPL::Class::Meta); |