comparison lib/IMPL/Object/Singleton.pm @ 407:c6e90e02dd17 ref20150831

renamed Lib->lib
author cin
date Fri, 04 Sep 2015 19:40:23 +0300
parents
children
comparison
equal deleted inserted replaced
406:f23fcb19d3c1 407:c6e90e02dd17
1 package IMPL::Object::Singleton;
2 use strict;
3 use warnings;
4
5 require IMPL::Exception;
6 use parent qw(
7 IMPL::Class::Meta
8 );
9
10 __PACKAGE__->static_accessor_own(_instance => undef);
11
12 sub InitInstance {
13 my $self = shift;
14 die IMPL::InvalidOperationException->new("Only one instance of the singleton can be created", $self)
15 if $self->_instance;
16
17 $self->_instance($self->new(@_));
18 }
19
20 sub instance {
21 my $this = shift;
22 return $this->_instance || $this->_instance($this->Activate());
23 }
24
25 sub Activate {
26 die IMPL::NotImplementedException->new("Activation isn't implemented", shift);
27 }
28
29 sub Release {
30 shift->_instance(undef);
31 }
32
33 1;
34
35 __END__
36
37 =pod
38
39 =head1 SYNOPSIS
40
41 =begin code
42
43 package Foo;
44
45 use parent qw(IMPL::Object IMPL::Object::Singleton);
46
47 #....
48
49 Foo->isnatnce->some_work();
50
51 Foo->isnatnce->get_result();
52
53 =end code
54
55 =head1 DESCRIPTION
56
57 Реализует шаблон Singleton. Наследники данного класса могут иметь только один
58 экземпляр. Создать этот экземпляр можно явно, используюя конструктор, либо
59 автоматически при обращении к свойству C<instance>, для этого нужно
60 переопределить метод C<Activate()>
61
62 =head1 MEMBERS
63
64 =head2 C<CTOR()>
65
66 Проверяет на единственность экземпляра класса, запоминает созданный экземпляр.
67
68 =head2 C<[static,get]instance>
69
70 Текущий экземпляр класса, если он еще не создан, то вызывает метод C<Activate>.
71
72 =head2 C<[static,abstract]Activate()>
73
74 Вызывается автоматически при обращении к свойству C<instance>, если экземпляр
75 объекта еще не был создан.
76
77 =head2 C<[static]Release()>
78
79 Освобождает текущий экземпляр.
80
81 =cut