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