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