Привет.

Задача: Есть некое семейство классов.
Каждый объект живёт в системе постоянно, но в начале запроса на него надо сделать 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

Ответить