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; |
