Mercurial > pub > Impl
view lib/IMPL/Object/Singleton.pm @ 418:3f38dabaf5cc ref20150831
sync
author | cin |
---|---|
date | Mon, 28 Dec 2015 15:11:35 +0300 |
parents | c6e90e02dd17 |
children |
line wrap: on
line source
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