package Test::TempDir;
BEGIN {
  $Test::TempDir::AUTHORITY = 'cpan:NUFFIN';
}
{
  $Test::TempDir::VERSION = '0.08';
}
# git description: v0.07-2-g9334cad


use strict;
use warnings;

use File::Temp ();

use Test::TempDir::Factory;

use Sub::Exporter -setup => {
    exports => [qw(temp_root tempdir tempfile scratch)],
    groups => {
        default => [qw(temp_root tempdir tempfile)],
    },
};

our ( $factory, $dir );

sub _factory   { $factory ||= Test::TempDir::Factory->new }
sub _dir       { $dir     ||= _factory->create }

END { undef $dir; undef $factory };

sub temp_root () { _dir->dir }

sub _temp_args { DIR => temp_root()->stringify, CLEANUP => 0 }
sub _template_args {
    if ( @_ % 2 == 0 ) {
        return ( _temp_args, @_ );
    } else {
        return ( $_[0], _temp_args, @_[1 .. $#_] );
    }
}

sub tempdir { File::Temp::tempdir( _template_args(@_) ) }

sub tempfile { File::Temp::tempfile( _template_args(@_) ) }

sub scratch {
    require Directory::Scratch;
    Directory::Scratch->new( _temp_args, @_ );
}


__PACKAGE__

__END__

=pod

=head1 NAME

Test::TempDir - Temporary files support for testing.

=head1 SYNOPSIS

    use Test::TempDir;

    my $test_tempdir = temp_root();

    my ( $fh, $file ) = tempfile();

    my $directory_scratch_obj = scratch();

=head1 DESCRIPTION

Test::TempDir provides temporary directory creation with testing in mind.

The differences between using this and using L<File::Temp> are:

=over 4

=item *

=for stopwords creatable

If C<t/tmp> is available (writable, creatable, etc) it's preferred over
C<$ENV{TMPDIR}> etc. Otherwise a temporary directory will be used.

This is C<temp_root>

=item *

Lock files are used on C<t/tmp>, to prevent race conditions when running under a
parallel test harness.

=item *

The C<temp_root> is cleaned at the end of a test run, but not if tests failed.

=item *

C<temp_root> is emptied at the beginning of a test run unconditionally.

=item *

The default policy is not to clean the individual C<tempfiles> and C<tempdirs>
within C<temp_root>, in order to aid in debugging of failed tests.

=back

=head1 EXPORTS

=over 4

=item C<temp_root>

The root of the temporary stuff.

=item C<tempfile>

=item C<tempdir>

Wrappers for the L<File::Temp> functions of the same name.

=for stopwords overridable

The default options are changed to use C<temp_root> for C<DIR> and disable
C<CLEANUP>, but these are overridable.

=item C<scratch>

Loads L<Directory::Scratch> and instantiates a new one, with the same default
options as C<tempfile> and C<tempdir>.

=back

=head1 SEE ALSO

L<File::Temp>, L<Directory::Scratch>, L<Path::Class>

=head1 VERSION CONTROL

This module is maintained using Git. You can get the latest version from
L<git://github.com/nothingmuch/test-tempdir.git>.

=head1 AUTHOR

Yuval Kogman E<lt>nothingmuch@woobling.orgE<gt>

=head1 COPYRIGHT

    Copyright (c) 2008 Yuval Kogman. All rights reserved
    This program is free software; you can redistribute
    it and/or modify it under the same terms as Perl itself.

=cut
