[Moscow.pm] Как правиьно сделать хранитель транзакции ?

Vladimir V. Perepelitsa inthrax на gmail.com
Ср Дек 3 13:23:24 PST 2008


чтобы избежать name clash лучше использовать недопустимые символы в
имени автогенеренного пакета.
например $package = ref($self) . '::Transaction+'

2008/12/3 Denis Evdokimov <evdokimov.denis на gmail.com>:
> Даже лучше заменить
> my $transaction_package_isa = '@' . $transaction_package . '::ISA';
> eval "$transaction_package_isa = ( 'sowebface::List::Transaction::End',
> ref(\$self) )";
> на
> {
>      no strict 'refs';
>      *{$transaction_package . '::ISA'} = [
> 'sowebface::List::Transaction::End', ref($self) ];
> }
>
>
>
> 3 декабря 2008 г. 22:53 пользователь Denis Evdokimov
> <evdokimov.denis на gmail.com> написал:
>>
>> Может так?
>> Правда мне тут не всё нравится, но лучше, чем через AUTOLOAD
>>
>> package sowebface::List::Transaction;
>> use strict;
>>
>> sub new
>> {
>>     my ( $class, $self ) = @_;
>>     die 'WTF?' unless ref $self;
>>     my $transaction_package = ref($self) . '::Transaction';
>>     my $new_self = bless {%$self}, $transaction_package;
>>     $new_self->transaction_begin();
>>     return $new_self;
>> }
>>
>> package sowebface::List::Transaction::End;
>>
>> sub DESTROY
>> {
>>     my $self = shift;
>>     $self->transaction_end();
>> }
>>
>> package My::Test;
>>
>> my $test = bless {};
>> my $tras_obj = sowebface::List::Transaction->new($test);
>> $tras_obj->work();
>>
>> sub work
>> {
>>     print "I work, maybe...\n";
>>     sleep 5;
>> }
>>
>> sub transaction_begin
>> {
>>     print "transaction_begin\n";
>> }
>>
>> sub transaction_end
>> {
>>     print "transaction_end\n";
>> }
>>
>
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
>



-- 
Best wishes,
Vladimir V. Perepelitsa aka Mons <inthrax на gmail.com>


Подробная информация о списке рассылки Moscow-pm