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;