Mercurial > pub > Impl
comparison Lib/IMPL/Object/Singleton.pm @ 263:0f59b2de72af
*fixed IMPL::DOM::Schema circular module references
*modified IMPL::Object::Singleton, added auto-activation
*code cleanups, docs
| author | sergey |
|---|---|
| date | Wed, 09 Jan 2013 05:17:44 +0400 |
| parents | 4d0e1962161c |
| children | 75a78cbf7dcf |
comparison
equal
deleted
inserted
replaced
| 262:4ac39b9e2ca4 | 263:0f59b2de72af |
|---|---|
| 1 package IMPL::Object::Singleton; | 1 package IMPL::Object::Singleton; |
| 2 use strict; | 2 use strict; |
| 3 use warnings; | 3 use warnings; |
| 4 | 4 |
| 5 require IMPL::Exception; | |
| 6 use parent qw( | |
| 7 IMPL::Class::Meta | |
| 8 ); | |
| 9 | |
| 10 __PACKAGE__->static_accessor_own(_instance => undef); | |
| 11 | |
| 5 my %instances; | 12 my %instances; |
| 6 | 13 |
| 7 sub CTOR { | 14 sub CTOR { |
| 8 die new IMPL::InvalidOperationException("Only one instance of the singleton can be created",ref $_[0], $instances{ref $_[0]}) if $instances{ref $_[0]}; | 15 die IMPL::InvalidOperationException->new("Only one instance of the singleton can be created",ref $_[0]) |
| 9 $instances{ref $_[0]} = $_[0]; | 16 if $_[0]->_instance; |
| 10 } | 17 } |
| 11 | 18 |
| 12 sub instance { | 19 sub instance { |
| 13 $instances{$_[0]} | 20 my $this = shift; |
| 21 return $this->_instance || $this->_instance($this->Activate()); | |
| 22 } | |
| 23 | |
| 24 sub Activate { | |
| 25 die IMPL::NotImplementedException->new("Activation isn't implemented", shift); | |
| 26 } | |
| 27 | |
| 28 sub Release { | |
| 29 shift->_instance(undef); | |
| 14 } | 30 } |
| 15 | 31 |
| 16 1; | 32 1; |
| 17 | 33 |
| 18 __END__ | 34 __END__ |
| 35 | 51 |
| 36 =end code | 52 =end code |
| 37 | 53 |
| 38 =head1 DESCRIPTION | 54 =head1 DESCRIPTION |
| 39 | 55 |
| 40 Реализует шаблон Singleton | 56 Реализует шаблон Singleton. Наследники данного класса могут иметь только один |
| 57 экземпляр. Создать этот экземпляр можно явно, используюя конструктор, либо | |
| 58 автоматически при обращении к свойству C<instance>, для этого нужно | |
| 59 переопределить метод C<Activate()> | |
| 41 | 60 |
| 42 =head1 MEMBERS | 61 =head1 MEMBERS |
| 43 | 62 |
| 44 =head2 OPERATORS | 63 =head2 C<CTOR()> |
| 45 | 64 |
| 46 =list | 65 Проверяет на единственность экземпляра класса, запоминает созданный экземпляр. |
| 47 | 66 |
| 48 =item C<instance CLASS(@params)> | 67 =head2 C<[static,get]instance> |
| 49 | 68 |
| 50 Создает или возвращает экземпляр класса, если экземляр не существует, то он создается с параметрами C<@params>. | 69 Текущий экземпляр класса, если он еще не создан, то вызывает метод C<Activate>. |
| 51 | 70 |
| 52 =over | 71 =head2 C<[static,abstract]Activate()> |
| 72 | |
| 73 Вызывается автоматически при обращении к свойству C<instance>, если экземпляр | |
| 74 объекта еще не был создан. | |
| 75 | |
| 76 =head2 C<[static]Release()> | |
| 77 | |
| 78 Освобождает текущий экземпляр. | |
| 53 | 79 |
| 54 =cut | 80 =cut |
