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 | 
