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 |
