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