[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