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