Привет.

Задача: Есть некое семейство классов.
Каждый объект живёт в системе постоянно, но в начале запроса на него
надо сделать transaction_begin, а в конце transaction_end.
Я не придумал ничего лучше чем сделать :
<pre>
#снаружи это как то так:
sub handler : Local {
   my ($self, $c, $listname) = @_;
   my $list=$c->model('Lists')->getlist($listname);
   # много много логики и прочей фигни
   $stash->{list}=$list; #тут оно ещё не сдохло.
}
#Дальше оно варится внутри TTk, Потом выходит из скупа и на настоящем
листе вызывается transaction_end()

#В хранилище функция 'получить':
sub getlist {
   my ($self,$lname)[EMAIL PROTECTED];
   return sowebface::List::Transaction->new($self->{lists}->{$lname});
}

#А транзакция это вот такая упячка:
package sowebface::List::Transaction;
use strict;
use overload
 '%{}' => sub {return ${shift()}},
 fallback =>1,
 ;

our $AUTOLOAD;

sub new {
   my ($class, $self)[EMAIL PROTECTED];
   die 'WTF?' unless ref $self;
   $self->transaction_begin();
   return bless \$self, $class;
}

sub DESTROY {
   my $self=shift;
   $$self->transaction_end();
}

sub AUTOLOAD {
   my $self=shift;
   $AUTOLOAD=~/::([^:]+)$/;
   my $m=$1;
   $self=$$self;
   if ($self->can($m)) {
       return $self->$m(@_);
   } else {
       return $self->{$m};
   }
}
</pre>

Спасите чтоли, ведь это делается наверняка намного проще .. =)
Мне нужно просто перехватывать refcount change, на самом деле, и делать
выводы, но я не докопал как это сделать по человечески, вот получился
такой монстрик.
То-есть мне надо дёрнутся, когда refcount>1  и когда стал refcount=1
обратно, один refcount - это я хранюсь в списке в модели.
Главное условие: никакого XS.
Ещё одно из условий - оно ещё и в Template::Stash должно правильно
отрабатывать.
И вообще, Транзакция должна быть объектом, который ей передан,
единственное, во время выхода из области видимости, она должна на себе
вызывать transaction_end и не убивать настоящий объект.


--
Ivan B. Serezhkin
Spamooborona, Yandex. http://so.yandex.ru/
--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить