diff 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
line wrap: on
line diff
--- a/Lib/IMPL/Object/Singleton.pm	Sat Dec 29 03:22:15 2012 +0400
+++ b/Lib/IMPL/Object/Singleton.pm	Wed Jan 09 05:17:44 2013 +0400
@@ -2,15 +2,31 @@
 use strict;
 use warnings;
 
+require IMPL::Exception;
+use parent qw(
+    IMPL::Class::Meta
+);
+
+__PACKAGE__->static_accessor_own(_instance => undef);
+
 my %instances;
 
 sub CTOR {
-    die new IMPL::InvalidOperationException("Only one instance of the singleton can be created",ref $_[0], $instances{ref $_[0]}) if $instances{ref $_[0]};
-    $instances{ref $_[0]} = $_[0];
+    die IMPL::InvalidOperationException->new("Only one instance of the singleton can be created",ref $_[0])
+        if $_[0]->_instance;
 }
 
 sub instance {
-    $instances{$_[0]}
+    my $this = shift;
+    return $this->_instance || $this->_instance($this->Activate());
+}
+
+sub Activate {
+    die IMPL::NotImplementedException->new("Activation isn't implemented", shift);
+}
+
+sub Release {
+    shift->_instance(undef);
 }
 
 1;
@@ -37,18 +53,28 @@
 
 =head1 DESCRIPTION
 
-Реализует шаблон Singleton
+Реализует шаблон Singleton. Наследники данного класса могут иметь только один
+экземпляр. Создать этот экземпляр можно явно, используюя конструктор, либо
+автоматически при обращении к свойству C<instance>, для этого нужно
+переопределить метод C<Activate()>
 
 =head1 MEMBERS
 
-=head2 OPERATORS
+=head2 C<CTOR()>
+
+Проверяет на единственность экземпляра класса, запоминает созданный экземпляр.
 
-=list
+=head2 C<[static,get]instance>
+
+Текущий экземпляр класса, если он еще не создан, то вызывает метод C<Activate>.
 
-=item C<instance CLASS(@params)>
+=head2 C<[static,abstract]Activate()>
 
-Создает или возвращает экземпляр класса, если экземляр не существует, то он создается с параметрами C<@params>.
+Вызывается автоматически при обращении к свойству C<instance>, если экземпляр
+объекта еще не был создан.
 
-=over
+=head2 C<[static]Release()>
+
+Освобождает текущий экземпляр.
 
 =cut