[Moscow.pm] Запутался

Konstantin S. Uvarin khedin на gmail.com
Ср Окт 3 01:07:04 PDT 2012


Приветствую! 

> вообще goto очень удобен в случаях когда идет последовательная
> инициализация (выделение) ресурсов и в случае если надо сделать откат:
> 
> sub init() {
>     unless (do_something1) { goto rollback_something1 }
>     unless (do_something2) { goto rollback_something2 }
>     unless (do_something3) { goto rollback_something3 }
>     unless (do_something4) { goto rollback_something4 }
>     return;
> 
>     rollback_something4:
>         rollback_something4();
>     rollback_something3:
>         rollback_something3();
>     rollback_something2:
>         rollback_something2();
>     rollback_something1:
>         rollback_something1();
> }
 
Интересно, а есть модуль для этого? Типа 

  my $stack = Roll::Back->new (rethrow => 0);
  $stack->push( init => \&do_something1, rollback => \&rollback_something1 );
  # ....
  $stack->commit; 

М.б. ещё commit => sub { ... } - типа, когда _все_ выполнено.

Если в каком-то из init'ов (или commit'ов) die - соответственно, $stack-
>rollback и все в обратном порядке.

Я пытался такое писать пару лет назад, и оно даже работало, но может уже есть 
готовый модуль?

--
WBR,
Konstantin S. Uvarin


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