407
|
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
|