comparison Lib/IMPL/Object/Singleton.pm @ 263:0f59b2de72af

*fixed IMPL::DOM::Schema circular module references *modified IMPL::Object::Singleton, added auto-activation *code cleanups, docs
author sergey
date Wed, 09 Jan 2013 05:17:44 +0400
parents 4d0e1962161c
children 75a78cbf7dcf
comparison
equal deleted inserted replaced
262:4ac39b9e2ca4 263:0f59b2de72af
1 package IMPL::Object::Singleton; 1 package IMPL::Object::Singleton;
2 use strict; 2 use strict;
3 use warnings; 3 use warnings;
4 4
5 require IMPL::Exception;
6 use parent qw(
7 IMPL::Class::Meta
8 );
9
10 __PACKAGE__->static_accessor_own(_instance => undef);
11
5 my %instances; 12 my %instances;
6 13
7 sub CTOR { 14 sub CTOR {
8 die new IMPL::InvalidOperationException("Only one instance of the singleton can be created",ref $_[0], $instances{ref $_[0]}) if $instances{ref $_[0]}; 15 die IMPL::InvalidOperationException->new("Only one instance of the singleton can be created",ref $_[0])
9 $instances{ref $_[0]} = $_[0]; 16 if $_[0]->_instance;
10 } 17 }
11 18
12 sub instance { 19 sub instance {
13 $instances{$_[0]} 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);
14 } 30 }
15 31
16 1; 32 1;
17 33
18 __END__ 34 __END__
35 51
36 =end code 52 =end code
37 53
38 =head1 DESCRIPTION 54 =head1 DESCRIPTION
39 55
40 Реализует шаблон Singleton 56 Реализует шаблон Singleton. Наследники данного класса могут иметь только один
57 экземпляр. Создать этот экземпляр можно явно, используюя конструктор, либо
58 автоматически при обращении к свойству C<instance>, для этого нужно
59 переопределить метод C<Activate()>
41 60
42 =head1 MEMBERS 61 =head1 MEMBERS
43 62
44 =head2 OPERATORS 63 =head2 C<CTOR()>
45 64
46 =list 65 Проверяет на единственность экземпляра класса, запоминает созданный экземпляр.
47 66
48 =item C<instance CLASS(@params)> 67 =head2 C<[static,get]instance>
49 68
50 Создает или возвращает экземпляр класса, если экземляр не существует, то он создается с параметрами C<@params>. 69 Текущий экземпляр класса, если он еще не создан, то вызывает метод C<Activate>.
51 70
52 =over 71 =head2 C<[static,abstract]Activate()>
72
73 Вызывается автоматически при обращении к свойству C<instance>, если экземпляр
74 объекта еще не был создан.
75
76 =head2 C<[static]Release()>
77
78 Освобождает текущий экземпляр.
53 79
54 =cut 80 =cut