Mercurial > pub > Impl
comparison Lib/IMPL/Class/Meta.pm @ 163:6ce1f052b90a
temp commit
author | wizard |
---|---|
date | Tue, 15 Mar 2011 02:32:42 +0300 |
parents | 3765adf1803f |
children | eb3e9861a761 |
comparison
equal
deleted
inserted
replaced
162:39c8788eded5 | 163:6ce1f052b90a |
---|---|
55 } | 55 } |
56 } | 56 } |
57 } | 57 } |
58 } | 58 } |
59 | 59 |
60 sub static_accessor { | |
61 my ($class,$name,$value) = @_; | |
62 $class = ref $class || $class; | |
63 | |
64 no strict 'refs'; | |
65 | |
66 *{"${class}::${name}"} = sub { | |
67 if (@_ > 1) { | |
68 my $self = shift; | |
69 $self = ref $self || $self; | |
70 | |
71 if ($class ne $self) { | |
72 $self->class_data_accessor( $name => $_[0]); | |
73 } else { | |
74 $value = $_[0]; | |
75 } | |
76 } else { | |
77 $value; | |
78 } | |
79 }; | |
80 $value | |
81 }; | |
82 | |
60 sub _find_class_data { | 83 sub _find_class_data { |
61 my ($class,$name) = @_; | 84 my ($class,$name) = @_; |
62 | 85 |
63 no strict 'refs'; | 86 no strict 'refs'; |
64 | 87 |
211 | 234 |
212 Foo->class_data('info')->{version} = 2; | 235 Foo->class_data('info')->{version} = 2; |
213 Bar->say_version; # will print '1'; | 236 Bar->say_version; # will print '1'; |
214 Foo->say_version; # will print '2'; | 237 Foo->say_version; # will print '2'; |
215 | 238 |
216 =end code | 239 =end code |
240 | |
241 =item C<static_accessor($name[,$value])> | |
242 | |
243 Создает статическое свойство с именем C<$name> и начальным значением C<$value>. | |
244 | |
245 Использование данного свойство аналогично использованию C<class_data>, за исключением | |
246 того, что C<class_data> гарантирует, что наследник обладает собственной копией данных, | |
247 изменение которых не коснется ни базового класса, ни соседей. | |
248 | |
249 =begin code | |
250 | |
251 package Foo; | |
252 use base qw(IMPL::Class::Meta); | |
253 | |
254 __PACKAGE__->static_accessor( info => { version => 1 } ); | |
255 | |
256 package Bar; | |
257 use base qw(Foo); | |
258 | |
259 __PACKAGE__->info->{language} = 'English'; # Foo->info->{language} will become 'English' to!!! | |
260 __PACKAGE__->info({language => 'English'}); # will define own 'info' but will loose original data. | |
261 | |
262 =end code | |
263 | |
217 | 264 |
218 =back | 265 =back |
219 | 266 |
220 =cut | 267 =cut |