Mercurial > pub > Impl
comparison Lib/IMPL/Config.pm @ 73:2f31ecabe9ea
doc
security
author | wizard |
---|---|
date | Mon, 29 Mar 2010 06:56:05 +0400 |
parents | 76b878ad6596 |
children | 76515373dac0 |
comparison
equal
deleted
inserted
replaced
72:eac47fa4f262 | 73:2f31ecabe9ea |
---|---|
116 1; | 116 1; |
117 __END__ | 117 __END__ |
118 | 118 |
119 =pod | 119 =pod |
120 | 120 |
121 =h1 SYNOPSIS | 121 =head1 NAME |
122 | 122 |
123 package App::Config | 123 C<IMPL::Config> - базовый класс для настраиваемого приложения. |
124 use base qw(IMPL::Config) | 124 |
125 =head1 SYNOPSIS | |
126 | |
127 =begin code | |
128 | |
129 # define application | |
130 | |
131 package MyApp; | |
132 use base qw(IMPL::Config); | |
125 | 133 |
126 use IMPL::Class::Property; | 134 use IMPL::Class::Property; |
127 use IMPL::Config::Class; | 135 use IMPL::Config::Class; |
128 | 136 |
129 BEGIN { | 137 BEGIN { |
130 public property SimpleString => prop_all; | 138 public property SimpleString => prop_all; |
131 public property MyClass => prop_all; | |
132 public property DataSource => prop_all; | 139 public property DataSource => prop_all; |
133 } | 140 } |
134 | 141 |
135 sub CTOR { | 142 sub CTOR { |
136 my $this = shift; | 143 my $this = shift; |
137 | 144 |
138 $this->MyClass(new IMPL::Config::Class(Type => 'MyClass'')) unless $this->MyClass; | |
139 $this->DataSource( | 145 $this->DataSource( |
140 new IMPL::Config::Activator( | 146 new IMPL::Config::Activator( |
141 type => 'MyDataSource', | 147 factory => 'MyDataSource', |
142 args=>{ | 148 parameters=>{ |
143 host => 'localhost', | 149 host => 'localhost', |
144 user => 'dbuser' | 150 user => 'dbuser' |
145 } | 151 } |
146 ) | 152 ) |
147 ) unless $this->Exists('DataSource'); | 153 ) unless $this->Exists('DataSource'); |
148 } | 154 } |
149 | 155 |
150 # in some script | 156 # using application object |
151 | 157 |
152 my $app = spawn App::Config('default.xml'); | 158 my $app = spawn MyApp('default.xml'); |
153 | 159 |
154 $app->Run(); | 160 $app->Run(); |
155 | 161 |
162 =end code | |
163 | |
164 Ниже приведен пример файла C<default.xml> содержащего настройки приложения | |
165 | |
166 =begin code xml | |
167 | |
168 <app type='MyApp'> | |
169 <SimpleString>The application</SimpleString> | |
170 <DataSource type='IMPL::Config::Activator'> | |
171 <factory>MyDataSourceClass</factory> | |
172 <parameters type='HASH'> | |
173 <host>localhost</host> | |
174 <user>dbuser</user> | |
175 </parameters> | |
176 </DataSource> | |
177 </app> | |
178 | |
179 =end code xml | |
180 | |
156 =head1 DESCRIPTION | 181 =head1 DESCRIPTION |
157 | 182 |
158 Позволяет сохранить/загрузить конфигурацию. Также все классы конфигурации | 183 C<[Serializable]> |
159 должны наследоваться от данного класса, и все Public свойства будут | 184 |
160 автоматически сохраняться и восстанавливаться. | 185 C<[Autofill]> |
186 | |
187 C<use base IMPL::Object::Accessor> | |
188 | |
189 Базовый класс для приложений. Использует подход, что приложение | |
190 является объектом, состояние которого предтавляет собой конфигурацию, | |
191 а методы - логику. | |
192 | |
193 Данный класс реализует функционал десериализации (и сериализации) экземпляра | |
194 приложения из XML документа. Для этого используется механизм C<IMPL::Serialization>. | |
195 При этом используются опции C<IMPL::Serialization::XmlFormatter> C<IdentOutput> и | |
196 C<SkipWhitespace> для записи документа в легко читаемом виде. | |
197 | |
198 Поскольку в результате восстановления приложения восстанавливаются все элементы | |
199 из файла конфигурации, то это может потребовать значительных ресурсов для | |
200 создания частей, которые могут никогда не понадобиться. Например, не требуется инициализация | |
201 источника данных для передачи пользователю статических данных, сохраненных на диске. | |
202 | |
203 Для решения этой проблемы используются специальные объекты C<IMPL::Config::Activator>. | |
204 | |
205 Если у приложения описано свойство, в котором хранится C<IMPL::Config::Activator>, то | |
206 при первом обращении к такому свойству, будет создан объект вызовом метода | |
207 C<< IMPL::Config::Activator->activate() >> и возвращен как значение этого свойства. | |
208 Таким образом реализуется прозрачная отложенная активация объектов, что позволяет | |
209 экономить ресурсы. | |
161 | 210 |
162 =head1 MEMBERS | 211 =head1 MEMBERS |
163 | 212 |
164 =over | 213 =over |
165 | 214 |
166 =item C<< IMPL::Config->LoadXMLFile($fileName) >> | 215 =item C<[static] LoadXMLFile($fileName) > |
167 | 216 |
168 Создает из XML файла экземпляр приложения | 217 Создает из XML файла C<$fileName> экземпляр приложения |
169 | 218 |
170 =item C<< $instance->SaveXMLFile($fileName) >> | 219 =item C<SaveXMLFile($fileName)> |
171 | 220 |
172 Сохраняет приложение в файл | 221 Сохраняет приложение в файл C<$fileName> |
173 | 222 |
174 =item C<< xml >> | 223 =item C<[get] xml > |
175 | 224 |
176 Сохраняет конфигурацию приложения в XML строку | 225 Сохраняет конфигурацию приложения в XML строку. |
177 | 226 |
178 =item C<< IMPL::Config->spawn($file) >> | 227 =item C<[static,operator] spawn($file)> |
179 | 228 |
180 Синоним для C<LoadXMLFile> | 229 Синоним для C<LoadXMLFile>, предполагается использование как оператора. |
230 | |
231 =item C<rawGet($propname,...)> | |
232 | |
233 Метод для получения значений свойств приложения. Данный метод позволяет избежать | |
234 использование активации объектов через C<IMPL::Config::Activator>. | |
181 | 235 |
182 =back | 236 =back |
183 | 237 |
184 =cut | 238 =cut |