Mercurial > pub > Impl
diff 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 |
line wrap: on
line diff
--- a/Lib/IMPL/Object/Singleton.pm Sat Dec 29 03:22:15 2012 +0400 +++ b/Lib/IMPL/Object/Singleton.pm Wed Jan 09 05:17:44 2013 +0400 @@ -2,15 +2,31 @@ use strict; use warnings; +require IMPL::Exception; +use parent qw( + IMPL::Class::Meta +); + +__PACKAGE__->static_accessor_own(_instance => undef); + my %instances; sub CTOR { - die new IMPL::InvalidOperationException("Only one instance of the singleton can be created",ref $_[0], $instances{ref $_[0]}) if $instances{ref $_[0]}; - $instances{ref $_[0]} = $_[0]; + die IMPL::InvalidOperationException->new("Only one instance of the singleton can be created",ref $_[0]) + if $_[0]->_instance; } sub instance { - $instances{$_[0]} + my $this = shift; + return $this->_instance || $this->_instance($this->Activate()); +} + +sub Activate { + die IMPL::NotImplementedException->new("Activation isn't implemented", shift); +} + +sub Release { + shift->_instance(undef); } 1; @@ -37,18 +53,28 @@ =head1 DESCRIPTION -Реализует шаблон Singleton +Реализует шаблон Singleton. Наследники данного класса могут иметь только один +экземпляр. Создать этот экземпляр можно явно, используюя конструктор, либо +автоматически при обращении к свойству C<instance>, для этого нужно +переопределить метод C<Activate()> =head1 MEMBERS -=head2 OPERATORS +=head2 C<CTOR()> + +Проверяет на единственность экземпляра класса, запоминает созданный экземпляр. -=list +=head2 C<[static,get]instance> + +Текущий экземпляр класса, если он еще не создан, то вызывает метод C<Activate>. -=item C<instance CLASS(@params)> +=head2 C<[static,abstract]Activate()> -Создает или возвращает экземпляр класса, если экземляр не существует, то он создается с параметрами C<@params>. +Вызывается автоматически при обращении к свойству C<instance>, если экземпляр +объекта еще не был создан. -=over +=head2 C<[static]Release()> + +Освобождает текущий экземпляр. =cut