Mercurial > pub > Impl
comparison Lib/IMPL/Config.pm @ 60:b0c068da93ac
Lazy activation for the configuration objects (final concept)
small fixes
| author | wizard |
|---|---|
| date | Tue, 09 Mar 2010 19:47:39 +0300 |
| parents | a35b60b16a99 |
| children | 76b878ad6596 |
comparison
equal
deleted
inserted
replaced
| 59:0f3e369553bd | 60:b0c068da93ac |
|---|---|
| 1 package IMPL::Config; | 1 package IMPL::Config; |
| 2 use strict; | 2 use strict; |
| 3 use warnings; | 3 use warnings; |
| 4 | 4 |
| 5 use base qw(IMPL::Object IMPL::Object::Serializable IMPL::Object::Autofill); | 5 use base qw(IMPL::Object::Accessor IMPL::Object::Serializable IMPL::Object::Autofill); |
| 6 | 6 |
| 7 __PACKAGE__->PassThroughArgs; | 7 __PACKAGE__->PassThroughArgs; |
| 8 | 8 |
| 9 use IMPL::Class::Member; | 9 use IMPL::Class::Member; |
| 10 use IMPL::Class::PropertyInfo; | 10 use IMPL::Class::PropertyInfo; |
| 11 use IMPL::Exception; | 11 use IMPL::Exception; |
| 12 | 12 |
| 13 use IMPL::Serialization; | 13 use IMPL::Serialization; |
| 14 use IMPL::Serialization::XmlFormatter; | 14 use IMPL::Serialization::XmlFormatter; |
| 15 | |
| 16 | |
| 15 | 17 |
| 16 sub LoadXMLFile { | 18 sub LoadXMLFile { |
| 17 my ($self,$file) = @_; | 19 my ($self,$file) = @_; |
| 18 | 20 |
| 19 my $class = ref $self || $self; | 21 my $class = ref $self || $self; |
| 77 | 79 |
| 78 foreach my $info ($this->get_meta('IMPL::Class::PropertyInfo')) { | 80 foreach my $info ($this->get_meta('IMPL::Class::PropertyInfo')) { |
| 79 next if $info->Access != IMPL::Class::Member::MOD_PUBLIC; # save only public properties | 81 next if $info->Access != IMPL::Class::Member::MOD_PUBLIC; # save only public properties |
| 80 | 82 |
| 81 my $name = $info->Name; | 83 my $name = $info->Name; |
| 82 $ctx->AddVar($name => $this->$name()) if $this->$name(); | 84 $ctx->AddVar($name => $this->rawGet($name)) if $this->rawGet($name); |
| 83 } | 85 } |
| 86 | |
| 84 } | 87 } |
| 85 | 88 |
| 86 sub spawn { | 89 sub spawn { |
| 87 goto &LoadXMLFile; | 90 goto &LoadXMLFile; |
| 91 } | |
| 92 | |
| 93 sub get { | |
| 94 my $this = shift; | |
| 95 | |
| 96 if (@_ == 1) { | |
| 97 my $obj = $this->SUPER::get(@_); | |
| 98 return UNIVERSAL::isa($obj,'IMPL::Config::Activator') ? $obj->activate : $obj; | |
| 99 } else { | |
| 100 my @objs = $this->SUPER::get(@_); | |
| 101 return map UNIVERSAL::isa($_,'IMPL::Config::Activator') ? $_->activate : $_, @objs ; | |
| 102 } | |
| 103 } | |
| 104 | |
| 105 sub rawGet { | |
| 106 my $this = shift; | |
| 107 return $this->SUPER::get(@_); | |
| 108 } | |
| 109 | |
| 110 sub Exists { | |
| 111 $_[0]->SUPER::get($_[1]) ? 1 : 0; | |
| 88 } | 112 } |
| 89 | 113 |
| 90 1; | 114 1; |
| 91 __END__ | 115 __END__ |
| 92 | 116 |
| 101 use IMPL::Config::Class; | 125 use IMPL::Config::Class; |
| 102 | 126 |
| 103 BEGIN { | 127 BEGIN { |
| 104 public property SimpleString => prop_all; | 128 public property SimpleString => prop_all; |
| 105 public property MyClass => prop_all; | 129 public property MyClass => prop_all; |
| 106 public lazy property DataSource => prop_all, {type => 'App::DataSource', factory => sub {}}; | 130 public property DataSource => prop_all; |
| 107 } | 131 } |
| 108 | 132 |
| 109 sub CTOR { | 133 sub CTOR { |
| 110 my $this = shift; | 134 my $this = shift; |
| 111 $this->superCTOR(@_); | |
| 112 | 135 |
| 113 $this->MyClass(new IMPL::Config::Class(Type => MyClass)) unless $this->MyClass; | 136 $this->MyClass(new IMPL::Config::Class(Type => 'MyClass'')) unless $this->MyClass; |
| 137 $this->DataSource( | |
| 138 new IMPL::Config::Activator( | |
| 139 type => 'MyDataSource', | |
| 140 args=>{ | |
| 141 host => 'localhost', | |
| 142 user => 'dbuser' | |
| 143 } | |
| 144 ) | |
| 145 ) unless $this->Exists('DataSource'); | |
| 114 } | 146 } |
| 115 | 147 |
| 116 # in some script | 148 # in some script |
| 117 | 149 |
| 118 my $app = spawn App::Config('default.xml'); | 150 my $app = spawn App::Config('default.xml'); |
| 127 | 159 |
| 128 =head1 MEMBERS | 160 =head1 MEMBERS |
| 129 | 161 |
| 130 =over | 162 =over |
| 131 | 163 |
| 132 =item static LoadXMLFile($fileName) | 164 =item C<< IMPL::Config->LoadXMLFile($fileName) >> |
| 165 | |
| 133 Создает из XML файла экземпляр приложения | 166 Создает из XML файла экземпляр приложения |
| 134 | 167 |
| 135 =item SaveXMLFile($fileName) | 168 =item C<< $instance->SaveXMLFile($fileName) >> |
| 169 | |
| 136 Сохраняет приложение в файл | 170 Сохраняет приложение в файл |
| 137 | 171 |
| 138 =item xml | 172 =item C<< xml >> |
| 173 | |
| 139 Сохраняет конфигурацию приложения в XML строку | 174 Сохраняет конфигурацию приложения в XML строку |
| 175 | |
| 176 =item C<< IMPL::Config->spawn($file) >> | |
| 177 | |
| 178 Синоним для C<LoadXMLFile> | |
| 140 | 179 |
| 141 =back | 180 =back |
| 142 | 181 |
| 143 =cut | 182 =cut |
