The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Test::Approvals;
use strict;
use warnings FATAL => 'all';
use version; our $VERSION = qv('v0.0.4');

use Test::Approvals::Reporters;
use Test::Approvals::Namers::DefaultNamer;
use Test::Approvals::Core::FileApprover qw();
use Test::Approvals::Writers::TextWriter;
use Test::Builder;

require Exporter;
use base qw(Exporter);

our @EXPORT_OK = qw(use_reporter use_reporter_instance verify verify_ok
  reporter use_name namer);

my $test = Test::Builder->new();
my $namer_instance;
my $reporter_instance = Test::Approvals::Reporters::IntroductionReporter->new();

sub namer {
    return $namer_instance;
}

sub reporter {
    return $reporter_instance;
}

sub use_name {
    my ($test_name) = @_;
    $namer_instance =
      Test::Approvals::Namers::DefaultNamer->new( name => $test_name );
    return $namer_instance;
}

sub use_reporter_instance {
    $reporter_instance = shift;
    return $reporter_instance;
}

sub use_reporter {
    my ($reporter_type) = @_;
    return use_reporter_instance $reporter_type->new();
}

sub verify {
    my ($results) = @_;
    my $w = Test::Approvals::Writers::TextWriter->new( result => $results );

    return Test::Approvals::Core::FileApprover::verify( $w, namer(),
        reporter() );
}

sub verify_ok {
    my ( $results, $name ) = @_;
    if ( defined $name ) {
        use_name($name);
    }
    return $test->ok( verify $results, $namer_instance->name );
}

1;
__END__
=head1 NAME

Test::Approvals - Capture human intelligence in your tests

=head1 VERSION

This documentation refers to Test::Approvals version v0.0.4

=head1 SYNOPSIS

    use Test::Approvals qw(use_reporter verify_ok);

    use_reporter('Test::Approvals::Reporters::DiffReporter');
    verify_ok 'Hello', 'Hello Test';

=head1 DESCRIPTION

The Test::Approvals modules provides the top level interface to ApprovalTestss
for Perl.  You can use ApprovalTests to verify objects that require more than 
a simple assert, including long strings, large arrays, and complex hash
structures and objects.  Perl already has great modules that overlap with 
ApprovalTests, but Test::Approvals really shines when you take advantage of
reporters to provide different views into failing tests.  Sometimes printing to 
STDOUT just isn't enough.  

=head1 SUBROUTINES/METHODS

=head2 namer

    my $namer = namer();

Gets the currently configured Test::Approvals::Namers:: instance.

=head2 reporter

    my $reporter = reporter();

Gets the currently configured Test::Approvals::Reporters:: instance.

=head2 use_name

    my $namer = use_name('My Test Name');

Construct a namer for the specified name, configure it as the current instance, 
and return the instance.

=head2 use_reporter

    my $reporter = use_reporter('Test::Approvals::Reporters::DiffReporter');

Construct a reporter of the specified type, configure it as the current 
instance, and return the instance.

=head2 use_reporter_instance

    my $reporter = Test::Approvals::Reporters::DiffReporter->new();
    my $ref = use_reporter_instance($reporter);

Like 'use_reporter', but use the provided instance instead of constructing a 
new instance.

=head2 verify

    my $ok = verify('Hello');
    ok $ok, 'My Test';

Construct a writer for the specified data and use it (along with the current 
namer and reporter instances) to verify against the approved data.  Returns a
value indicating whether the data matched.  The reporter is launched when 
appropriate.

You can pass anything to verify that Perl can easily stringify in a scalar 
context.  So, passing an array, a hash, or raw reference to verify is not going 
to produce useful results.  In these cases, take advantage of Data::Dumper.

    use Data::Dumper;
    my %person = ( First => 'Fred', Last => 'Flintrock' );
    ok verify(Dumper( \%person )), 'Fred test';

=head2 verify_ok

    use_name('Hello Test');
    verify_ok('Hello');

Like 'verify', but also automatically call 'ok' with the test name provided by
the current namer instance.  Or you can pass the name explicitly for a more
traditional Test::More experience:

    verify_ok 'Hello', 'Hello Test';

=head1 DIAGNOSTICS

None at this time.

=head1 CONFIGURATION AND ENVIRONMENT

None.

=head1 DEPENDENCIES

=over

Exporter
Test::Builder
version

=back

=head1 INCOMPATIBILITIES

None known.

=head1 BUGS AND LIMITATIONS

Windows-only.  Linux/OSX/other support will be added when time and access to 
those platforms permit.

=head1 AUTHOR

Jim Counts - @jamesrcounts

=head1 LICENSE AND COPYRIGHT

Copyright (C) 2013 Jim Counts

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    L<http://www.apache.org/licenses/LICENSE-2.0>

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.