[Moscow.pm] Как правиьно сделать хранитель транзакции ?
Ivan B. Serezhkin
vany на yandex-team.ru
Пн Дек 1 22:26:14 PST 2008
Привет.
Задача: Есть некое семейство классов.
Каждый объект живёт в системе постоянно, но в начале запроса на него
надо сделать 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)=@_;
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)=@_;
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