comparison Lib/IMPL/Class/Property/Base.pm @ 275:6253872024a4

*refactoring IMPL::Class
author cin
date Thu, 31 Jan 2013 02:18:31 +0400
parents 6d8092d8ce1b
children 8a5da17d7ef9
comparison
equal deleted inserted replaced
274:8d36073411b1 275:6253872024a4
76 my $key = $self->MakeFactoryKey($propInfo); 76 my $key = $self->MakeFactoryKey($propInfo);
77 77
78 my $factoryInfo = $factoryCache{$key}; 78 my $factoryInfo = $factoryCache{$key};
79 79
80 unless ($factoryInfo) { 80 unless ($factoryInfo) {
81 my $mutators = $self->GenerateAccessors($propInfo->Mutators); 81 my $mutators = $self->GenerateAccessors($propInfo->mutators);
82 $factoryInfo = { 82 $factoryInfo = {
83 factory => $self->CreateFactory( 83 factory => $self->CreateFactory(
84 $access_code{ $propInfo->Access }, 84 $access_code{ $propInfo->access },
85 $propInfo->Attributes->{validator} ? $validator_code : "", 85 $propInfo->attributes->{validator} ? $validator_code : "",
86 $mutators->{owner}, 86 $mutators->{owner},
87 $mutators->{get} || $accessor_get_no, 87 $mutators->{get} || $accessor_get_no,
88 $mutators->{set} || $accessor_set_no 88 $mutators->{set} || $accessor_set_no
89 ), 89 ),
90 mutators => $mutators 90 mutators => $mutators
92 $factoryCache{$key} = $factoryInfo; 92 $factoryCache{$key} = $factoryInfo;
93 } 93 }
94 94
95 { 95 {
96 no strict 'refs'; 96 no strict 'refs';
97 *{ $propInfo->Class.'::'.$propInfo->Name } = $factoryInfo->{factory}->($self->RemapFactoryParams($propInfo)); 97 *{ $propInfo->class.'::'.$propInfo->name } = $factoryInfo->{factory}->($self->RemapFactoryParams($propInfo));
98 } 98 }
99 99
100 my $mutators = $factoryInfo->{mutators}; 100 my $mutators = $factoryInfo->{mutators};
101 101
102 $propInfo->canGet( $mutators->{get} ? 1 : 0 ); 102 $propInfo->canGet( $mutators->{get} ? 1 : 0 );
112 112
113 # extract from property info: class, name, get_accessor, set_accessor, validator 113 # extract from property info: class, name, get_accessor, set_accessor, validator
114 sub RemapFactoryParams { 114 sub RemapFactoryParams {
115 my ($self,$propInfo) = @_; 115 my ($self,$propInfo) = @_;
116 116
117 my $mutators = $propInfo->Mutators; 117 my $mutators = $propInfo->mutators;
118 my $class = $propInfo->Class; 118 my $class = $propInfo->class;
119 my $validator = $propInfo->Attributes->{validator}; 119 my $validator = $propInfo->attributes->{validator};
120 120
121 die new IMPL::Exception('Can\'t find the specified validator',$class,$validator) if $validator and ref $validator ne 'CODE' and not $class->can($validator); 121 die new IMPL::Exception('Can\'t find the specified validator',$class,$validator) if $validator and ref $validator ne 'CODE' and not $class->can($validator);
122 122
123 return ( 123 return (
124 $propInfo->get(qw(Class Name)), 124 $propInfo->get(qw(class name)),
125 (ref $mutators? 125 (ref $mutators?
126 ($mutators->{set},$mutators->{get}) 126 ($mutators->{set},$mutators->{get})
127 : 127 :
128 (undef,undef) 128 (undef,undef)
129 ), 129 ),
132 } 132 }
133 133
134 sub MakeFactoryKey { 134 sub MakeFactoryKey {
135 my ($self,$propInfo) = @_; 135 my ($self,$propInfo) = @_;
136 136
137 my ($access,$mutators,$validator) = ($propInfo->get(qw(Access Mutators)),$propInfo->Attributes->{validator}); 137 my ($access,$mutators,$validator) = ($propInfo->get(qw(access mutators)),$propInfo->attributes->{validator});
138 138
139 my $implementor = ref $self || $self; 139 my $implementor = ref $self || $self;
140 140
141 return join ('', 141 return join ('',
142 $implementor, 142 $implementor,