view lib/IMPL/Object/Singleton.pm @ 427:09e0086a82a7 ref20150831 tip

Merge
author cin
date Tue, 15 May 2018 00:51:33 +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