Mercurial > pub > Impl
diff Lib/IMPL/Class/Meta.pm @ 163:6ce1f052b90a
temp commit
author | wizard |
---|---|
date | Tue, 15 Mar 2011 02:32:42 +0300 |
parents | 3765adf1803f |
children | eb3e9861a761 |
line wrap: on
line diff
--- a/Lib/IMPL/Class/Meta.pm Wed Dec 29 16:55:24 2010 +0300 +++ b/Lib/IMPL/Class/Meta.pm Tue Mar 15 02:32:42 2011 +0300 @@ -57,6 +57,29 @@ } } +sub static_accessor { + my ($class,$name,$value) = @_; + $class = ref $class || $class; + + no strict 'refs'; + + *{"${class}::${name}"} = sub { + if (@_ > 1) { + my $self = shift; + $self = ref $self || $self; + + if ($class ne $self) { + $self->class_data_accessor( $name => $_[0]); + } else { + $value = $_[0]; + } + } else { + $value; + } + }; + $value +}; + sub _find_class_data { my ($class,$name) = @_; @@ -213,7 +236,31 @@ Bar->say_version; # will print '1'; Foo->say_version; # will print '2'; -=end code +=end code + +=item C<static_accessor($name[,$value])> + +Создает статическое свойство с именем C<$name> и начальным значением C<$value>. + +Использование данного свойство аналогично использованию C<class_data>, за исключением +того, что C<class_data> гарантирует, что наследник обладает собственной копией данных, +изменение которых не коснется ни базового класса, ни соседей. + +=begin code + +package Foo; +use base qw(IMPL::Class::Meta); + +__PACKAGE__->static_accessor( info => { version => 1 } ); + +package Bar; +use base qw(Foo); + +__PACKAGE__->info->{language} = 'English'; # Foo->info->{language} will become 'English' to!!! +__PACKAGE__->info({language => 'English'}); # will define own 'info' but will loose original data. + +=end code + =back