Даже лучше заменить<br>my $transaction_package_isa = '@' . $transaction_package . '::ISA';<br>eval "$transaction_package_isa = ( 'sowebface::List::Transaction::End', ref(\$self) )";<br>
на<br>{<br> no strict 'refs';<br> *{$transaction_package . '::ISA'} = [ 'sowebface::List::Transaction::End', ref($self) ];<br>}<br><br><br><br><div class="gmail_quote">3 декабря 2008 г. 22:53 пользователь Denis Evdokimov <span dir="ltr"><<a href="mailto:evdokimov.denis@gmail.com">evdokimov.denis@gmail.com</a>></span> написал:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Может так?<br>Правда мне тут не всё нравится, но лучше, чем через AUTOLOAD<div class="Ih2E3d">
<br><br>package sowebface::List::Transaction;<br>use strict;<br><br></div><div class="Ih2E3d">sub new<br>{<br> my ( $class, $self ) = @_;<br> die 'WTF?' unless ref $self;<br></div>
my $transaction_package = ref($self) . '::Transaction';<br> my $new_self = bless {%$self}, $transaction_package;<br> $new_self->transaction_begin();<br> return $new_self;<br>}<br><br>package sowebface::List::Transaction::End;<div class="Ih2E3d">
<br><br>sub DESTROY<br>{<br> my $self = shift;<br>
$self->transaction_end();<br>}<br><br></div>package My::Test;<br><br>my $test = bless {};<br>my $tras_obj = sowebface::List::Transaction->new($test);<br>$tras_obj->work();<br><br>sub work<br>{<br> print "I work, maybe...\n";<br>
sleep 5;<br>}<br><br>sub transaction_begin<br>{<br> print "transaction_begin\n";<br>}<br><br>sub transaction_end<br>{<br> print "transaction_end\n";<br>}<br><br>
</blockquote></div><br>