Mercurial > pub > Impl
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 |