NAME

Perinci::Sub::Gen::Undoable - Generate undoable (transactional, dry-runnable, idempotent) function

VERSION

version 0.06

SYNOPSIS

# See an example, like in Setup::File::Symlink

DESCRIPTION

This module helps you write undoable/transactional functions (as well as functions that support dry-run and are idempotent).

SEE ALSO

Rinci::function::Undo, Rinci::function::Transaction, Rinci

Setup.

DESCRIPTION

This module has Rinci metadata.

FUNCTIONS

None are exported by default, but they are exportable.

gen_undoable_func(%args) -> [status, msg, result, meta]

Generate undoable (transactional, dry-runnable, idempotent) function.

This function is basically a helper for writing undoable (as well as transactional, dry-runnable, and idempotent) function. This function will generate a function with the basic structure, and you supply the 'business-logic' bits through the 'build_steps' and 'steps' arguments.

This generator helps because writing an undoable and transactional function is a bit tricky. This helper shields function writer from having to interact with the transaction manager, or writing the steps loop, or writing the rollback mechanism on his/her own, and just focus on writing the actual steps.

Some notes:

  • Though it generally should not die(), generated function might still die, there is no big eval{} loop inside. But this is usually OK since a function wrapper (like Perinci::Sub::Wrapper) has this loop.

For examples, see Setup::* Perl modules.

Arguments ('*' denotes required arguments):

  • args => hash (default: {})

    Specification for generated function's arguments.

    This is just like the metadata property 'args'.

  • build_steps* => code

    Code to build steps.

    This is the code that should build the steps. Code will be given (\%args) and should return an enveloped response. If response is not a success one, it will be used as the function's response. Otherwise, code should return the steps (an array). By convention, each step should be an array like this: [NAME, ...] where the first element is the step name and the rest are step arguments.

  • description* => śtr

    Generated function's description.

  • hook_check_args* => code

    Code to check function's arguments.

    This is a (temporary?) hook to allow the generated function to check its arguments. This should later be mostly unnecessary when Perinci::Sub::Wrapper already integrates with Data::Sah to generate argument-checking code from schema.

    Code is given (\%args) and should return an enveloped response. You can modify the args (e.g. set defaults, etc) and it will be carried on to the other steps like 'build_steps'. If response is not a success one, it will be used as the function's response.

  • name* => str

    Fully qualified function name.

  • steps* => hash

    Steps specification.

  • summary* => str

    Generated function's summary.

  • trash_dir => bool (default: 0)

    Whether function needs undo trash directory.

  • tx => hash (default: {})

    Whether function is transactional.

    Valid values include {use=>1} (meaning function can use transaction and will utilize it if given '-tx' special argument), {req=>1} (meaning function always require '-tx' and will return error response if not given it). Otherwise function will not use transaction, undo data will be passed to function via '-undodata' special argument and returned by function in 'undodata' result metadata.

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.

1 POD Error

The following errors were encountered while parsing the POD:

Around line 459:

Non-ASCII character seen before =encoding in 'I<śtr>'. Assuming UTF-8