package Setup; # to make podweaver happy

our $VERSION = '1.0.1'; # VERSION

1;
# ABSTRACT: Specification for setup module


__END__
=pod

=head1 NAME

Setup - Specification for setup module

=head1 VERSION

version 1.0.1

=head1 SPECIFICATION VERSION

1.0

=head1 SPECIFICATION

This is a specification for setup modules. Setup modules are normal Perl modules
that live under the C<Setup::> namespace and contain setup functions. Setup
functions are normal Perl subroutines, typically named with C<setup_> prefix
(like C<setup_file>, C<setup_unix_user>, etc.) They are typically used for,
well, setting up stuffs, like software installation, system setup, or
configuration management.

Setup functions must support these features: idempotency (useful for
configuration management), transaction, undo/redo (useful for uninstallation of
software), and dry-run/simulation mode (useful for debugging).

Setup functions must follow L<Rinci> specification, since Rinci already
specifies all of these functionalities. Setup functions should also be written
with the helper L<Perinci::Sub::Undoable>, to make all Setup functions more
consistent.

As an additional note, aside from idempotency, the functions must also check for
initial/original condition. There could be various state changes between the
time of do and undo; a file can be deleted or modified by other processes. The
undo must be flexible enough so it can reverse whatever state changes the
previous do phase did whenever it can, but not disrupt other processes' changes.

=head1 SEE ALSO

L<Rinci> (specifically L<Rinci::function::Undo> and
L<Rinci::function::Transaction>).

L<Riap> (specifically L<Riap::Transaction>).

=head1 AUTHOR

Steven Haryanto <stevenharyanto@gmail.com>

=head1 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.

=cut

