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