annotate Lib/IMPL/Class/Meta.pm @ 134:44977efed303

Significant performance optimizations Fixed recursion problems due converting objects to JSON Added cache support for the templates Added discovery feature for the web methods
author wizard
date Mon, 21 Jun 2010 02:39:53 +0400
parents 6c25ea91c985
children 3765adf1803f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
1 package IMPL::Class::Meta;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
2 use strict;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
3
90
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
4 use Storable qw(dclone);
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
5
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
6 my %class_meta;
90
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
7 my %class_data;
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
8
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
9 sub set_meta {
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
10 my ($class,$meta_data) = @_;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
11 $class = ref $class if ref $class;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
12
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
13 # тут нельзя использовать стандартное исключение, поскольку для него используется
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
14 # класс IMPL::Object::Accessor, который наследуется от текущего класса
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
15 die "The meta_data parameter should be an object" if not ref $meta_data;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
16
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
17 push @{$class_meta{$class}{ref $meta_data}},$meta_data;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
18 }
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
19
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
20 sub get_meta {
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
21 my ($class,$meta_class,$predicate,$deep) = @_;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
22 $class = ref $class if ref $class;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
23 no strict 'refs';
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
24 my @result;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
25
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
26 if ($deep) {
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
27 @result = map { $_->can('get_meta') ? $_->get_meta($meta_class,$predicate,$deep) : () } @{$class.'::ISA'};
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
28 }
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
29
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
30 if ($predicate) {
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
31 push @result,grep( &$predicate($_), map( @{$class_meta{$class}{$_}}, grep( $_->isa($meta_class), keys %{$class_meta{$class} || {}} ) ) );
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
32 } else {
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
33 push @result, map( @{$class_meta{$class}{$_} || []}, grep( $_->isa($meta_class), keys %{$class_meta{$class} || {}} ) );
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
34 }
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
35 wantarray ? @result : \@result;
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
36 }
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
37
90
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
38 sub class_data {
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
39 my $class = shift;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
40 $class = ref $class || $class;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
41
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
42 if (@_ > 1) {
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
43 my ($name,$value) = @_;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
44 return $class_data{$class}{$name} = $value;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
45 } else {
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
46 my ($name) = @_;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
47
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
48 if( exists $class_data{$class}{$name} ) {
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
49 $class_data{$class}{$name};
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
50 } else {
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
51 if ( my $value = $class->_find_class_data($name) ) {
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
52 $class_data{$class}{$name} = dclone($value);
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
53 } else {
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
54 undef;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
55 }
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
56 }
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
57 }
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
58 }
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
59
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
60 sub _find_class_data {
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
61 my ($class,$name) = @_;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
62
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
63 no strict 'refs';
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
64
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
65 exists $class_data{$_}{$name} and return $class_data{$_}{$name} foreach @{"${class}::ISA"};
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
66
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
67 my $val;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
68 $val = $_->_find_class_data($name) and return $val foreach @{"${class}::ISA"};
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
69 }
49
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
70
16ada169ca75 migrating to the Eclipse IDE
wizard@linux-odin.local
parents: 0
diff changeset
71 1;
90
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
72
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
73 __END__
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
74
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
75 =pod
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
76
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
77 =head1 NAME
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
78
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
79 C<IMPL::Class::Meta> - информация хранимая на уровне класса.
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
80
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
81 =head1 SYNOPSIS
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
82
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
83 =begin code
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
84
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
85 package InfoMeta;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
86
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
87 use base qw(IMPL::Object IMPL::Object::Autofill);
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
88 use IMPL::Class::Property;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
89
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
90 __PACKAGE__->PassThroughArgs;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
91
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
92 BEGIN {
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
93 public property name => prop_get | owner_set;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
94 }
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
95
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
96 package InfoExMeta;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
97 use base qw(InfoMeta);
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
98
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
99 __PACKAGE__->PassThroughArgs;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
100
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
101 BEGIN {
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
102 public property description => prop_all;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
103 }
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
104
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
105 package Foo;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
106
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
107 __PACKAGE__->set_meta(new InfoMeta(name => 'info'));
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
108 __PACKAGE__->set_meta(new InfoExMeta(name => 'infoEx', description => 'extended info' ));
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
109
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
110 package main;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
111
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
112 # get all InfoMeta, InfoExMeta will be included, becouse it's derived from InfoMeta
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
113 my @info = Foo->get_meta('InfoMeta'); # will get two objects, 'info' and 'infoEx';
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
114
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
115 # get all InfoExMeta meta
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
116 @info = Foo->get_meta('InfoExMeta'); # will get only 'infoEx'
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
117
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
118 # get filtered meta
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
119 @info = Foo->get_meta('InfoMeta', sub { $_->name eq 'info'} ); # will get only 'info'
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
120
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
121 =end code
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
122
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
123 =head1 DESCRIPTION
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
124
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
125 Позвоялет расширять информацию о типах (класса) при помощи метаданных, метаданными являются любые объекты,
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
126 притом выборка метаданных приоизводится по их типу (классу), что позволяет выбрать все однотипные метаданные.
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
127
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
128 Существует возможность выборки метаданных с учетом унаследованных от базовых классов
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
129
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
130 =head1 MEMBERS
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
131
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
132 =over
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
133
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
134 =item C<set_meta($meta_data)>
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
135
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
136 Добавляет метаданные C<$meta_data> к классу.
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
137
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
138 =item C<get_meta($meta_class,$predicate,$deep)>
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
139
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
140 Выбирает метаданные типа C<$meta_class> и его наследников, с возможностью фильтрации и получения
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
141 метаданных базовых классов.
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
142
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
143 =over
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
144
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
145 =item C<$meta_class>
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
146
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
147 Тип метаданных
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
148
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
149 =item C<$predicate>
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
150
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
151 Подпрограмма, которая будет вызываться для каждых найденных метаданных и на основе результата
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
152 ее выполнения метаданные будут включены в результат или нет. Получеат в качестве параметра
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
153 объект с метаданными, возвращает C<true> - включить метаданные в результа, C<false> - пропустить
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
154 метаданные как не подходящие. Также переменная C<$_> ссылается на текущий объект с метаданными.
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
155
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
156 =begin code
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
157
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
158 my @info = Foo->get_meta(
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
159 'InfoMeta',
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
160 sub { ref $_ eq 'InfoMeta'}, # exclude subclasses ('InfoExMeta')
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
161 1 # deep search
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
162 );
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
163
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
164 my @info = Foo->get_meta(
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
165 'InfoMeta',
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
166 sub {
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
167 my $item = shift;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
168 ref $item eq 'InfoMeta' # exclude subclasses ('InfoExMeta')
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
169 },
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
170 1 # deep search
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
171 );
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
172
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
173 =end code
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
174
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
175 =item C<$deep>
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
176
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
177 Осуществлять поиск по базовым классам.
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
178
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
179 =back
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
180
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
181 =item C<class_data($name,$new_value)>
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
182
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
183 В отличии от метаданных, C<class_data> не накапливает информацию,
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
184 а хранит только один экземпляр для одного ключа C<$name>.
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
185
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
186 Если новое значение не задано, то осуществляется выборка сохраненного,
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
187 если текущий класс не имеет сохраненного значения, то оно ищется в базовых
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
188 классах, затем копия найденного значения сохраняется в текущем классе и
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
189 возвращается наружу. Это позволяет базовым классам задавать значение по-умолчанию,
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
190 которые могут быть изменены или заменены субклассами.
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
191
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
192 =begin code
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
193
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
194 package Foo;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
195 use base qw(IMPL::Class::Meta);
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
196
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
197 __PACKAGE__->class_data( info => { version => 1 } ); # will be default for all subclasses
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
198
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
199 sub say_version {
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
200 my ($self) = @_;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
201
111
6c25ea91c985 ControllerUnit concept
wizard
parents: 90
diff changeset
202 print $self->class_data('info')->{version};
90
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
203 }
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
204
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
205 package Bar;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
206 use base qw(Foo);
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
207
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
208 __PACKAGE__->class_data('info')->{ language } = 'English';
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
209
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
210 package main;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
211
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
212 Foo->class_data('info')->{version} = 2;
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
213 Bar->say_version; # will print '1';
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
214 Foo->say_version; # will print '2';
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
215
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
216 =end code
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
217
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
218 =back
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
219
dc1da0389db7 Small improvements in the abstract object class
wizard
parents: 49
diff changeset
220 =cut