NAME
    Setup::Multi - Setup using a series of other setup functions

VERSION
    version 0.07

SYNOPSIS
     use Setup::Multi     'setup_multi';
     use Setup::File::Dir 'setup_dir';
     use Setup::File      'setup_file';

     # simple usage (doesn't save undo data)
     my $res = setup_multi
         subs => [
             setup_dir  => [{name=>'/foo',         should_exist=>1},
                            {name=>'/foo/bar',     should_exist=>1},
                            {name=>'/foo/bar/baz', should_exist=>1}],
             setup_file =>  {name=>"/foo/bar/baz/qux", should_exist=>1},
         ];
     die unless $res->[0] == 200 || $res->[0] == 304;

     # perform setup and save undo data (undo data should be serializable)
     $res = setup_multi ..., -undo_action => 'do';
     die unless $res->[0] == 200 || $res->[0] == 304;
     my $undo_data = $res->[3]{undo_data};

     # perform undo
     $res = setup_multi ..., -undo_action => "undo", -undo_data=>$undo_data;
     die unless $res->[0] == 200 || $res->[0] == 304;

DESCRIPTION
    This module uses Log::Any logging framework.

    This module has Rinci metadata.

FAQ
  When to use coderef (routine refs) or string (routine names) in subs?
    Since the routine name is included in undo data, use string to make it
    easily serializable.

SEE ALSO
    Setup

FUNCTIONS
  setup_multi(%args) -> [status, msg, result, meta]
    Setup using a series of other setup functions.

    Accept a list of setup subroutine name and arguments, or coderefs, and
    call them each sequentially as steps. If one step fails, the whole steps
    will be rolled back using the undo data. If all steps succeed, return
    the concatenated undo data from each step.

    This function is declared as supporting the 'undo' and 'dry_run'
    features, so all setup functions mentioned in 'subs' argument must also
    support those two features (but this is not currently checked).

    Arguments ('*' denotes required arguments):

    *   subs* => *array*

        List of setup subroutine (names/refs) and arguments.

        Setup subroutine can be a string (its name) or a coderef. If
        subroutine is a non-qualified name (i.e., foo instead of
        Package::foo), it will be qualified with caller's package. Argument
        can be a single hashref or arrayref (of hashrefs). Example, if subs
        are:

         [
           'Pkg::func1'  => \%args,
           'func2'       => [\%args2, \%args3, \%args4],
           \&func3       => [\%args5],
           sub{...}      => \%args6,
         ]

        then the subs which will be called:

         Pkg::func1->(%args);
         func2->(%args2);
         func2->(%args3);
         func2->(%args4);
         func3(%args5);
         (sub{...})->(%args6);

    Return value:

    Returns an enveloped result (an array). First element (status) is an
    integer containing HTTP status code (200 means OK, 4xx caller error, 5xx
    function error). Second element (msg) is a string containing error
    message, or 'OK' if status is 200. Third element (result) is optional,
    the actual result. Fourth element (meta) is called result metadata and
    is optional, a hash that contains extra information.

AUTHOR
    Steven Haryanto <stevenharyanto@gmail.com>

COPYRIGHT AND LICENSE
    This software is copyright (c) 2012 by Steven Haryanto.

    This is free software; you can redistribute it and/or modify it under
    the same terms as the Perl 5 programming language system itself.

