Mercurial > pub > Impl
comparison Lib/DOM/Site.pm @ 0:03e58a454b20
Создан репозитарий
author | Sergey |
---|---|
date | Tue, 14 Jul 2009 12:54:37 +0400 |
parents | |
children | 16ada169ca75 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:03e58a454b20 |
---|---|
1 package DOM::Site; | |
2 use strict; | |
3 use Common; | |
4 our @ISA = qw(Object); | |
5 | |
6 our $Name; | |
7 our @Providers; | |
8 our $AUTOLOAD; | |
9 | |
10 BEGIN { | |
11 DeclareProperty(Objects => ACCESS_READ); | |
12 DeclareProperty(Providers => ACCESS_NONE); | |
13 } | |
14 | |
15 sub RegisterObject { | |
16 my ($this,$name,$object) = @_; | |
17 | |
18 $this->{$Objects}->{$name} = $object; | |
19 } | |
20 | |
21 sub RegisterProvider { | |
22 my ($this,$provider) = @_; | |
23 | |
24 my $refInfo = $provider->GetProviderInfo(); | |
25 | |
26 if ($refInfo->{'Host'} eq __PACKAGE__) { | |
27 die new Exception("Provider $refInfo->{'Name'} already registered") if exists $this->{$Providers}->{$refInfo->{'Name'}}; | |
28 while (my ($name,$method) = each %{$refInfo->{'Methods'}}) { | |
29 no strict 'refs'; | |
30 no warnings 'redefine'; | |
31 *{__PACKAGE__ . '::' . $name} = sub { | |
32 shift; | |
33 $method->($provider,$this,@_); | |
34 }; | |
35 } | |
36 | |
37 while (my ($name,$object) = each %{$refInfo->{'Objects'}}) { | |
38 $this->{$Objects}->{$refInfo->{'Name'}}->{$name} = $object; | |
39 } | |
40 | |
41 $this->{$Providers}->{$refInfo->{'Name'}} = 1; | |
42 } | |
43 } | |
44 | |
45 sub construct { | |
46 my $self = shift; | |
47 | |
48 my $site = $self->new(); | |
49 $site->RegisterObject(Site => { Name => $Name}); | |
50 foreach my $provider (@Providers) { | |
51 my $providerFile = $provider; | |
52 $providerFile =~ s/::/\//g; | |
53 $providerFile .= '.pm'; | |
54 eval { | |
55 require $providerFile; | |
56 }; | |
57 if ($@) { | |
58 my $InnerErr = $@; | |
59 die new Exception("Failed to load provider $provider", $InnerErr); | |
60 } | |
61 if ($provider->can('construct')) { | |
62 $site->RegisterProvider($provider->construct()); | |
63 } else { | |
64 $site->RegisterProvider($provider); | |
65 } | |
66 } | |
67 return $site; | |
68 } | |
69 | |
70 sub Dispose { | |
71 my ($this) = @_; | |
72 | |
73 UNIVERSAL::can($_,'Dispose') and $_->Dispose foreach values %{$this->{$Objects} || {}}; | |
74 | |
75 undef %$this; | |
76 | |
77 $this->SUPER::Dispose; | |
78 } | |
79 | |
80 1; |