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); |
