Mercurial > pub > Impl
comparison Lib/IMPL/Config.pm @ 0:03e58a454b20
Создан репозитарий
| author | Sergey |
|---|---|
| date | Tue, 14 Jul 2009 12:54:37 +0400 |
| parents | |
| children | a9b70d836b28 |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:03e58a454b20 |
|---|---|
| 1 package IMPL::Config; | |
| 2 use strict; | |
| 3 use warnings; | |
| 4 | |
| 5 use base qw(IMPL::Object IMPL::Object::Serializable IMPL::Object::Autofill); | |
| 6 | |
| 7 __PACKAGE__->PassThroughArgs; | |
| 8 | |
| 9 use IMPL::Class::Member; | |
| 10 use IMPL::Class::PropertyInfo; | |
| 11 use IMPL::Exception; | |
| 12 | |
| 13 use IMPL::Serialization; | |
| 14 use IMPL::Serialization::XmlFormatter; | |
| 15 | |
| 16 sub LoadXMLFile { | |
| 17 my ($self,$file) = @_; | |
| 18 | |
| 19 my $class = ref $self || $self; | |
| 20 | |
| 21 my $serializer = new IMPL::Serializer( | |
| 22 Formatter => new IMPL::Serialization::XmlFormatter( | |
| 23 IdentOutput => 1, | |
| 24 SkipWhitespace => 1 | |
| 25 ) | |
| 26 ); | |
| 27 | |
| 28 open my $hFile,'<',$file or die new IMPL::Exception("Failed to open file",$file,$!); | |
| 29 | |
| 30 my $obj; | |
| 31 eval { | |
| 32 $obj = $serializer->Deserialize($hFile); | |
| 33 }; | |
| 34 | |
| 35 if ($@) { | |
| 36 my $e=$@; | |
| 37 die new IMPL::Exception("Can't load the configuration file",$file,$e); | |
| 38 } | |
| 39 return $obj; | |
| 40 } | |
| 41 | |
| 42 sub SaveXMLFile { | |
| 43 my ($this,$file) = @_; | |
| 44 | |
| 45 my $serializer = new IMPL::Serializer( | |
| 46 Formatter => new IMPL::Serialization::XmlFormatter( | |
| 47 IdentOutput => 1, | |
| 48 SkipWhitespace => 1 | |
| 49 ) | |
| 50 ); | |
| 51 | |
| 52 open my $hFile,'>',$file or die new IMPL::Exception("Failed to open file",$file,$!); | |
| 53 | |
| 54 $serializer->Serialize($hFile, $this); | |
| 55 } | |
| 56 | |
| 57 sub xml { | |
| 58 my $this = shift; | |
| 59 my $serializer = new IMPL::Serializer( | |
| 60 Formatter => new IMPL::Serialization::XmlFormatter( | |
| 61 IdentOutput => 1, | |
| 62 SkipWhitespace => 1 | |
| 63 ) | |
| 64 ); | |
| 65 my $str = ''; | |
| 66 open my $hFile,'>',\$str or die new IMPL::Exception("Failed to open stream",$!); | |
| 67 | |
| 68 $serializer->Serialize($hFile, $this); | |
| 69 | |
| 70 undef $hFile; | |
| 71 | |
| 72 return $str; | |
| 73 } | |
| 74 | |
| 75 sub save { | |
| 76 my ($this,$ctx) = @_; | |
| 77 | |
| 78 foreach my $info ($this->get_meta('IMPL::Class::PropertyInfo')) { | |
| 79 next if $info->Access != IMPL::Class::Member::MOD_PUBLIC; # save only public properties | |
| 80 | |
| 81 my $name = $info->Name; | |
| 82 $ctx->AddVar($name => $this->$name()) if $this->$name(); | |
| 83 } | |
| 84 } | |
| 85 | |
| 86 1; | |
| 87 __END__ | |
| 88 | |
| 89 =pod | |
| 90 | |
| 91 =h1 SYNOPSIS | |
| 92 | |
| 93 package App::Config | |
| 94 use base qw(IMPL::Config) | |
| 95 | |
| 96 use IMPL::Class::Property; | |
| 97 use IMPL::Config::Class; | |
| 98 | |
| 99 BEGIN { | |
| 100 public property SimpleString => prop_all; | |
| 101 public property MyClass => prop_all; | |
| 102 } | |
| 103 | |
| 104 sub CTOR { | |
| 105 my $this = shift; | |
| 106 $this->superCTOR(@_); | |
| 107 | |
| 108 $this->MyClass(new IMPL::Config::Class(Type => MyClass)) unless $this->MyClass; | |
| 109 } | |
| 110 | |
| 111 =head1 DESCRIPTION | |
| 112 | |
| 113 Ïîçâîëÿåò ñîõðàíèòü/çàãðóçèòü êîíôèãóðàöèþ. Òàêæå âñå êëàññû êîíôèãóðàöèè | |
| 114 äîëæíû íàñëåäîâàòüñÿ îò äàííîãî êëàññà, è âñå Public ñâîéñòâà áóäóò | |
| 115 àâòîìàòè÷åñêè ñîõðàíÿòüñÿ è âîññòàíàâëèâàòüñÿ. | |
| 116 | |
| 117 =head1 MEMBERS | |
| 118 | |
| 119 =item static LoadXMLFile($fileName) | |
| 120 Ñîçäàåò èç XML ôàéëà ýêçåìïëÿð ïðèëîæåíèÿ | |
| 121 | |
| 122 =item SaveXMLFile($fileName) | |
| 123 Ñîõðàíÿåò ïðèëîæåíèå â ôàéë | |
| 124 | |
| 125 =item xml | |
| 126 Ñîõðàíÿåò êîíôèãóðàöèþ ïðèëîæåíèÿ â XML ñòðîêó | |
| 127 | |
| 128 =cut |
