49
|
1 package IMPL::Class::PropertyInfo;
|
|
2 use strict;
|
|
3
|
228
|
4 use parent qw(IMPL::Class::MemberInfo);
|
|
5
|
|
6 our %CTOR = ( 'IMPL::Class::MemberInfo' => '@_' );
|
49
|
7
|
275
|
8 __PACKAGE__->mk_accessors(qw(type mutators canGet canSet ownerSet isList));
|
49
|
9
|
|
10 my %LoadedModules;
|
|
11
|
|
12 sub CTOR {
|
|
13 my $this = shift;
|
|
14
|
275
|
15 if ( my $type = $this->attributes ? delete $this->attributes->{type} : undef ) {
|
|
16 $this->type($type);
|
49
|
17 }
|
|
18
|
275
|
19 $this->mutators(0) unless defined $this->mutators;
|
49
|
20 }
|
|
21
|
275
|
22 sub implementor {
|
49
|
23 my $this = shift;
|
134
|
24
|
49
|
25 if (@_) {
|
275
|
26 $this->SUPER::implementor(@_);
|
49
|
27 } else {
|
275
|
28 my $implementor = $this->SUPER::implementor;
|
49
|
29 return $implementor if $implementor;
|
|
30
|
|
31 $implementor = $this->SelectImplementor();
|
|
32
|
275
|
33 $this->implementor($implementor);
|
49
|
34 }
|
|
35
|
|
36 }
|
|
37
|
|
38 sub SelectImplementor {
|
275
|
39 eval {$_[0]->class->_PropertyImplementor} or die new IMPL::Exception('Can\'t find a property implementor for the specified class',$_[0]->Class);
|
274
|
40 }
|
|
41
|
49
|
42 1;
|
180
|
43
|
|
44 __END__
|
|
45
|
|
46 =pod
|
|
47
|
209
|
48 =head1 NAME
|
|
49
|
|
50 C<IMPL::Class::PropertyInfo> - метаданные о свойствах объектов. Используются для отражения и
|
|
51 проверки данных объектов.
|
|
52
|
|
53 =head1 DESCRIPTION
|
|
54
|
|
55 В зависимости от типа каждый объект предоставляет способ хранения данных, например хеши позволяют
|
|
56 хранить состояние в виде ассоциативного массива и т.д. Информация о свойстве предоставляет определенный
|
|
57 уровень абстракции.
|
|
58
|
180
|
59 =cut
|