Mercurial > pub > Impl
diff lib/IMPL/Object/Singleton.pm @ 407:c6e90e02dd17 ref20150831
renamed Lib->lib
author | cin |
---|---|
date | Fri, 04 Sep 2015 19:40:23 +0300 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/IMPL/Object/Singleton.pm Fri Sep 04 19:40:23 2015 +0300 @@ -0,0 +1,81 @@ +package IMPL::Object::Singleton; +use strict; +use warnings; + +require IMPL::Exception; +use parent qw( + IMPL::Class::Meta +); + +__PACKAGE__->static_accessor_own(_instance => undef); + +sub InitInstance { + my $self = shift; + die IMPL::InvalidOperationException->new("Only one instance of the singleton can be created", $self) + if $self->_instance; + + $self->_instance($self->new(@_)); +} + +sub instance { + 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; + +__END__ + +=pod + +=head1 SYNOPSIS + +=begin code + +package Foo; + +use parent qw(IMPL::Object IMPL::Object::Singleton); + +#.... + +Foo->isnatnce->some_work(); + +Foo->isnatnce->get_result(); + +=end code + +=head1 DESCRIPTION + +Реализует шаблон Singleton. Наследники данного класса могут иметь только один +экземпляр. Создать этот экземпляр можно явно, используюя конструктор, либо +автоматически при обращении к свойству C<instance>, для этого нужно +переопределить метод C<Activate()> + +=head1 MEMBERS + +=head2 C<CTOR()> + +Проверяет на единственность экземпляра класса, запоминает созданный экземпляр. + +=head2 C<[static,get]instance> + +Текущий экземпляр класса, если он еще не создан, то вызывает метод C<Activate>. + +=head2 C<[static,abstract]Activate()> + +Вызывается автоматически при обращении к свойству C<instance>, если экземпляр +объекта еще не был создан. + +=head2 C<[static]Release()> + +Освобождает текущий экземпляр. + +=cut