NAME
      Async::Chain - The right way to convert nested callback in plain struct
      or just the syntax sugar for guy who unlike deep indent.

VERSION
      Version 0.04

SYNOPSIS
      Every subroutine in the chain receive callable object as first argument
      followed by arguments of prevision object call. You can break chain in
      every sub, just do not call $next.

      You can skip some subroutins using skip or jump method.

          use Async::Chain;

          # with chain call

          chain
              sub {
                  my next = next;
                  AnyEvent::HTTP::http_get('http://perldoc.perl.org/', sub { $next->(@_)});
              },
              sub {
                  my next = next;
                  ...
                  $tnt->lua('box.insert', ..., sub { $next->(@_) })
              },
              sub {
                  my next = next;
                  ...
                  $next->();
              },
              sub {
                  ...
                  log(...);
              };


          # with constructor
          my $next = Async::Chain->new(
              sub {
                  my next = next;
                  AnyEvent::HTTP::http_get('http://perldoc.perl.org/', sub { $next->(@_)});
              },
              sub {
                  my next = next;
                  ...
                  $tnt->lua('box.insert', ..., sub { $next->(@_) })
              },
              sub {
                  my next = next;
                  ...
                  $next->();
              },
              finalize => sub {
                  ...
                  log(...);
              };
          );

          if (...) {
              $next->jump('finalize');
          }
          $next->();

RATIONALE
      A asynchronous code often have deep nested callbacks, therefore it is
      tangled and hard to change. This module help to convert code like
      following to some more readable form.

      without chain:

          sub f {
              ...
              some_anync_call @args, cb => sub {
                  ...
                  some_other_anync_call @args, cb => sub {
                  ...
                      ...
                          ...
                              yet_another_anync_call @args, cb => sub {
                                  ...
                              }
                  }
              }
          }

      using chain:
          chain
              sub {
                  my next = next;
                  ...
                  some_anync_call @args, cb => sub { $next->(@arg) }
              },
              sub {
                  my next = next;
                  ...
                  some_other_anync_call @args, cb => sub { $next->(@arg) }
              },
              sub {
                  my next = next;
                  ...
              },
              ...
              sub {
                  ...
                  yet_another_anync_call @args, cb => sub { $next->(@arg) }
              },
              sub {
                  ...
              };

SUBROUTINES/METHODS
  new
      The Asyn::Chain object constructor. Arguments are list of subroutine
      optionaly leaded by mark.

  chain
      Only one exported subroutine. Create and call Anync::Chain object.
      Return empty list.

  skip
      Skip one or more subroutine. Skipe one if no argument given. Return
      Anync::Chain object.

  jump
      Skip subroutines for first entry of named mark. Return Anync::Chain
      object.

  hitch
      Move named link to beginning of the chain. When link with given name
      not exists or first in chain, method has no effect. Return Anync::Chain
      object.

AUTHOR
      Anton Reznikov, "<anton.n.reznikov at gmail.com>"

BUGS
      Please report any bugs or feature requests, or through GitHub web
      interface at <https://github.com/17e/Async-Chain>.

SUPPORT
      You can find documentation for this module with the perldoc command.

          perldoc Async::Chain

ACKNOWLEDGEMENTS
      Mons Anderson - The original idia of chain and it first implementation.

LICENSE AND COPYRIGHT
      Copyright 2014 Anton Reznikov.

      This program is free software; you can redistribute it and/or modify it
      under the terms of the GNU General Public License as published by the
      Free Software Foundation; version 2 dated June, 1991 or at your option
      any later version.

      This program is distributed in the hope that it will be useful, but
      WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      General Public License for more details.

      A copy of the GNU General Public License is available in the source
      tree; if not, write to the Free Software Foundation, Inc., 51 Franklin
      Street, Fifth Floor, Boston, MA 02110-1301  USA



perl v5.10.1                      2014-06-19                   Async::Chain(3)