diff lib/IMPL/Object/Singleton.pm @ 407:c6e90e02dd17 ref20150831

renamed Lib->lib
author cin
date Fri, 04 Sep 2015 19:40:23 +0300
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/IMPL/Object/Singleton.pm	Fri Sep 04 19:40:23 2015 +0300
@@ -0,0 +1,81 @@
+package IMPL::Object::Singleton;
+use strict;
+use warnings;
+
+require IMPL::Exception;
+use parent qw(
+    IMPL::Class::Meta
+);
+
+__PACKAGE__->static_accessor_own(_instance => undef);
+
+sub InitInstance {
+    my $self = shift;
+    die IMPL::InvalidOperationException->new("Only one instance of the singleton can be created", $self)
+        if $self->_instance;
+        
+    $self->_instance($self->new(@_));
+}
+
+sub instance {
+    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;
+
+__END__
+
+=pod
+
+=head1 SYNOPSIS
+
+=begin code
+
+package Foo;
+
+use parent qw(IMPL::Object IMPL::Object::Singleton);
+
+#....
+
+Foo->isnatnce->some_work();
+
+Foo->isnatnce->get_result();
+
+=end code
+
+=head1 DESCRIPTION
+
+Реализует шаблон Singleton. Наследники данного класса могут иметь только один
+экземпляр. Создать этот экземпляр можно явно, используюя конструктор, либо
+автоматически при обращении к свойству C<instance>, для этого нужно
+переопределить метод C<Activate()>
+
+=head1 MEMBERS
+
+=head2 C<CTOR()>
+
+Проверяет на единственность экземпляра класса, запоминает созданный экземпляр.
+
+=head2 C<[static,get]instance>
+
+Текущий экземпляр класса, если он еще не создан, то вызывает метод C<Activate>.
+
+=head2 C<[static,abstract]Activate()>
+
+Вызывается автоматически при обращении к свойству C<instance>, если экземпляр
+объекта еще не был создан.
+
+=head2 C<[static]Release()>
+
+Освобождает текущий экземпляр.
+
+=cut