From b65e5d4b1a15d2896995b239fba7b8871e93f27f Mon Sep 17 00:00:00 2001 From: Mark Wells Date: Sun, 6 Jul 2014 20:29:15 -0700 Subject: [PATCH] Import original source of WebService-Northern911 0.1 --- .gitignore | 6 + Changes | 5 + MANIFEST | 18 +++ MYMETA.json | 47 +++++++ Makefile.PL | 37 ++++++ README | 77 ++++++++++++ debian/changelog | 5 + debian/compat | 1 + debian/control | 27 ++++ debian/copyright | 46 +++++++ debian/rules | 4 + debian/source/format | 1 + debian/watch | 2 + ignore.txt | 20 +++ lib/WebService/Northern911.pm | 221 +++++++++++++++++++++++++++++++++ lib/WebService/Northern911/Response.pm | 88 +++++++++++++ share/schema/live/wsdl | 1 + share/schema/live/xsd0 | 1 + share/schema/live/xsd1 | 1 + share/schema/live/xsd2 | 1 + share/schema/test/wsdl | 1 + share/schema/test/xsd0 | 1 + share/schema/test/xsd1 | 1 + share/schema/test/xsd2 | 1 + t/00-load.t | 13 ++ t/manifest.t | 15 +++ t/pod.t | 12 ++ 27 files changed, 653 insertions(+) create mode 100644 .gitignore create mode 100644 Changes create mode 100644 MANIFEST create mode 100644 MYMETA.json create mode 100644 Makefile.PL create mode 100644 README create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/copyright create mode 100755 debian/rules create mode 100644 debian/source/format create mode 100644 debian/watch create mode 100644 ignore.txt create mode 100755 lib/WebService/Northern911.pm create mode 100644 lib/WebService/Northern911/Response.pm create mode 100644 share/schema/live/wsdl create mode 100644 share/schema/live/xsd0 create mode 100644 share/schema/live/xsd1 create mode 100644 share/schema/live/xsd2 create mode 100644 share/schema/test/wsdl create mode 100644 share/schema/test/xsd0 create mode 100644 share/schema/test/xsd1 create mode 100644 share/schema/test/xsd2 create mode 100644 t/00-load.t create mode 100644 t/manifest.t create mode 100644 t/pod.t diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9788afa --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +blib/ +*.sw? +Makefile +Makefile.old +MYMETA.yml +pm_to_blib diff --git a/Changes b/Changes new file mode 100644 index 0000000..4dea726 --- /dev/null +++ b/Changes @@ -0,0 +1,5 @@ +Revision history for WebService-Northern911 + +0.01 Jul 7 2014 + Initial release + diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 0000000..8dedd9d --- /dev/null +++ b/MANIFEST @@ -0,0 +1,18 @@ +Changes +lib/WebService/Northern911.pm +lib/WebService/Northern911/Response.pm +Makefile.PL +MANIFEST This list of files +README +t/00-load.t +t/manifest.t +t/pod.t +share/schema/test/xsd2 +share/schema/test/wsdl +share/schema/test/xsd0 +share/schema/test/xsd1 +share/schema/live/xsd2 +share/schema/live/wsdl +share/schema/live/xsd0 +share/schema/live/xsd1 +ignore.txt diff --git a/MYMETA.json b/MYMETA.json new file mode 100644 index 0000000..0e95f50 --- /dev/null +++ b/MYMETA.json @@ -0,0 +1,47 @@ +{ + "abstract" : "Interface to the Northern 911 ALI database", + "author" : [ + "Mark Wells " + ], + "dynamic_config" : 0, + "generated_by" : "ExtUtils::MakeMaker version 6.8, CPAN::Meta::Converter version 2.120351", + "license" : [ + "unknown" + ], + "meta-spec" : { + "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", + "version" : "2" + }, + "name" : "WebService-Northern911", + "no_index" : { + "directory" : [ + "t", + "inc" + ] + }, + "prereqs" : { + "build" : { + "requires" : { + "File::ShareDir::Install" : "0", + "Test::More" : "0" + } + }, + "configure" : { + "requires" : { + "ExtUtils::MakeMaker" : "0" + } + }, + "runtime" : { + "requires" : { + "DateTime" : "0", + "File::ShareDir" : "0", + "XML::Compile" : "1", + "XML::Compile::SOAP" : "3", + "XML::Compile::WSDL11" : "3", + "perl" : "5.006" + } + } + }, + "release_status" : "stable", + "version" : "0.1" +} diff --git a/Makefile.PL b/Makefile.PL new file mode 100644 index 0000000..ebd2c26 --- /dev/null +++ b/Makefile.PL @@ -0,0 +1,37 @@ +use 5.006; +use strict; +use warnings FATAL => 'all'; +use ExtUtils::MakeMaker; +use File::ShareDir::Install; + +install_share dist => 'share'; + +WriteMakefile( + NAME => 'WebService::Northern911', + AUTHOR => q{Mark Wells }, + VERSION_FROM => 'lib/WebService/Northern911.pm', + ABSTRACT_FROM => 'lib/WebService/Northern911.pm', + LICENSE => 'Artistic_2_0', + PL_FILES => {}, + MIN_PERL_VERSION => 5.006, + CONFIGURE_REQUIRES => { + 'ExtUtils::MakeMaker' => 0, + }, + BUILD_REQUIRES => { + 'Test::More' => 0, + 'File::ShareDir::Install' => 0, + }, + PREREQ_PM => { + 'XML::Compile' => 1.0, + 'XML::Compile::SOAP' => 3.0, + 'XML::Compile::WSDL11'=> 3.0, + 'File::ShareDir' => 0, + 'DateTime' => 0, + }, + dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', }, + clean => { FILES => 'WebService-Northern911-*' }, +); + +package MY; +use File::ShareDir::Install qw(postamble); + diff --git a/README b/README new file mode 100644 index 0000000..7e979a8 --- /dev/null +++ b/README @@ -0,0 +1,77 @@ +WebService-Northern911 + +Interface to Northern 911's ALI database. + +Requires XML::Compile::WSDL11 and XML::Compile::SOAP. + +INSTALLATION + +To install this module, run the following commands: + + perl Makefile.PL + make + make test + make install + +SUPPORT AND DOCUMENTATION + +After installing, you can find documentation for this module with the +perldoc command. + + perldoc WebService::Northern911 + +You can also look for information at: + + RT, CPAN's request tracker (report bugs here) + http://rt.cpan.org/NoAuth/Bugs.html?Dist=WebService-Northern911 + + AnnoCPAN, Annotated CPAN documentation + http://annocpan.org/dist/WebService-Northern911 + + CPAN Ratings + http://cpanratings.perl.org/d/WebService-Northern911 + + Search CPAN + http://search.cpan.org/dist/WebService-Northern911/ + + +LICENSE AND COPYRIGHT + +Copyright (C) 2014 Mark Wells + +This program is free software; you can redistribute it and/or modify it +under the terms of the the Artistic License (2.0). You may obtain a +copy of the full license at: + +L + +Any use, modification, and distribution of the Standard or Modified +Versions is governed by this Artistic License. By using, modifying or +distributing the Package, you accept this license. Do not use, modify, +or distribute the Package, if you do not accept this license. + +If your Modified Version has been derived from a Modified Version made +by someone other than you, you are nevertheless required to ensure that +your Modified Version complies with the requirements of this license. + +This license does not grant you the right to use any trademark, service +mark, tradename, or logo of the Copyright Holder. + +This license includes the non-exclusive, worldwide, free-of-charge +patent license to make, have made, use, offer to sell, sell, import and +otherwise transfer the Package with respect to any patent claims +licensable by the Copyright Holder that are necessarily infringed by the +Package. If you institute patent litigation (including a cross-claim or +counterclaim) against any party alleging that the Package constitutes +direct or contributory patent infringement, then this Artistic License +to you shall terminate on the date that such litigation is filed. + +Disclaimer of Warranty: THE PACKAGE IS PROVIDED BY THE COPYRIGHT HOLDER +AND CONTRIBUTORS "AS IS' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES. +THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE, OR NON-INFRINGEMENT ARE DISCLAIMED TO THE EXTENT PERMITTED BY +YOUR LOCAL LAW. UNLESS REQUIRED BY LAW, NO COPYRIGHT HOLDER OR +CONTRIBUTOR WILL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, OR +CONSEQUENTIAL DAMAGES ARISING IN ANY WAY OUT OF THE USE OF THE PACKAGE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..250bb65 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,5 @@ +libwebservice-northern911-perl (0.1-1) unstable; urgency=low + + * Initial Release. + + -- Mark Wells Sun, 6 Jul 2014 20:25:33 -0700 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +9 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..8e593d2 --- /dev/null +++ b/debian/control @@ -0,0 +1,27 @@ +Source: libwebservice-northern911-perl +Section: perl +Priority: optional +Maintainer: Mark Wells +Build-Depends: debhelper (>= 9) +Build-Depends-Indep: libdatetime-perl, + libfile-sharedir-install-perl, + libfile-sharedir-perl, + libxml-compile-perl (>= 1), + libxml-compile-soap-perl (>= 3), + libxml-compile-wsdl11-perl (>= 3), + perl +Standards-Version: 3.9.5 +Homepage: https://metacpan.org/release/WebService-Northern911 + +Package: libwebservice-northern911-perl +Architecture: all +Depends: ${misc:Depends}, ${perl:Depends}, + libdatetime-perl, + libfile-sharedir-perl, + libxml-compile-perl (>= 1), + libxml-compile-soap-perl (>= 3), + libxml-compile-wsdl11-perl (>= 3) +Description: Interface to the Northern 911 ALI database + (no description was found) + . + This description was automagically extracted from the module by dh-make-perl. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..fbdc7ae --- /dev/null +++ b/debian/copyright @@ -0,0 +1,46 @@ +Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Source: https://metacpan.org/release/WebService-Northern911 +Upstream-Contact: Mark Wells, + . + Commercial support is available from Freeside Internet Services, Inc. +Upstream-Name: WebService-Northern911 +DISCLAIMER: This copyright info was automatically extracted + from the perl module. It may not be accurate, so you better + check the module sources in order to ensure the module for its + inclusion in Debian or for general legal information. Please, + if licensing information is incorrectly generated, file a bug + on dh-make-perl. + NOTE: Don't forget to remove this disclaimer once you are happy + with this file. + +Files: * +Copyright: Mark Wells, + . + Commercial support is available from Freeside Internet Services, Inc. +License: unparsable + +Files: debian/* +Copyright: 2014, Mark Wells +License: Artistic or GPL-1+ or unparsable + +License: Artistic + This program is free software; you can redistribute it and/or modify + it under the terms of the Artistic License, which comes with Perl. + . + On Debian systems, the complete text of the Artistic License can be + found in `/usr/share/common-licenses/Artistic'. + +License: GPL-1+ + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 1, or (at your option) + any later version. + . + On Debian systems, the complete text of version 1 of the GNU General + Public License can be found in `/usr/share/common-licenses/GPL-1'. + +License: unparsable + No known license could be automatically determined for this module. + If this module conforms to a commonly used license, please report this + as a bug in dh-make-perl. In any case, please find the proper license + and fix this file! diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..2d33f6a --- /dev/null +++ b/debian/rules @@ -0,0 +1,4 @@ +#!/usr/bin/make -f + +%: + dh $@ diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/debian/watch b/debian/watch new file mode 100644 index 0000000..a3df09c --- /dev/null +++ b/debian/watch @@ -0,0 +1,2 @@ +version=3 +https://metacpan.org/release/WebService-Northern911 .*/WebService-Northern911-v?(\d[\d.-]*)\.(?:tar(?:\.gz|\.bz2)?|tgz|zip)$ diff --git a/ignore.txt b/ignore.txt new file mode 100644 index 0000000..1a2d807 --- /dev/null +++ b/ignore.txt @@ -0,0 +1,20 @@ +Makefile +Makefile.old +Build +Build.bat +META.* +MYMETA.* +.build/ +_build/ +cover_db/ +blib/ +inc/ +.lwpcookies +.last_cover_stats +nytprof.out +pod2htm*.tmp +pm_to_blib +WebService-Northern911-* +WebService-Northern911-*.tar.gz +.gitignore +.git/* diff --git a/lib/WebService/Northern911.pm b/lib/WebService/Northern911.pm new file mode 100755 index 0000000..bab7e89 --- /dev/null +++ b/lib/WebService/Northern911.pm @@ -0,0 +1,221 @@ +package WebService::Northern911; + +use Digest::MD5 'md5_hex'; +use DateTime; +use XML::Compile::WSDL11; +use XML::Compile::SOAP11; +use XML::Compile::Transport::SOAPHTTP; +use File::ShareDir 'dist_dir'; + +use WebService::Northern911::Response; + +our $VERSION = 0.1; + +=head1 NAME + +WebService::Northern911 - Interface to the Northern 911 ALI database + +=head1 SYNOPSIS + +use WebService::Northern911; + +my $n911 = WebService::Northern911->new( vendor_code => '007', + password => '280fip1@' ); + +my $result = $n911->AddorUpdateCustomer( + PHONE_NUMBER => '4015559988', + FIRST_NAME => 'John', + LAST_NAME => 'Doe', + STREET_NUMBER => 1024, + STREET_NAME => 'Main St', + CITY => 'Calgary', + PROVINCE_STATE => 'AB', + POSTAL_CODE_ZIP => 'Z1A A2Z', +); +if ($result->is_success) { + print "Updated customer." +} else + print $result->error_message; +} + +=head1 METHODS + +=over 4 + +=item new OPTIONS + +Creates an object to access the API. OPTIONS must include C +and C. By default, this will connect to the development API; +for access to the live service, pass C => 1. + +=cut + +sub new { + my $class = shift; + my %opt = @_; + my $vendor_code = $opt{vendor_code} or die "WebService::Northern911::new() requires vendor_code\n"; + my $password = $opt{password} or die "WebService::Northern911::new() requires password\n"; + + # create the interface + # expensive, so reuse this object as much as possible + my $schema = dist_dir('WebService-Northern911') . '/schema'; + if ($opt{'live'}) { + $schema .= '/live'; + } else { + $schema .= '/test'; + } + + # yes, that's right, we have to distribute the schema with this module. + # XML::Compile::WSDL11 makes the argument that + my $client = XML::Compile::WSDL11->new("$schema/wsdl"); + for my $xsd (<$schema/xsd*>) { + $client->importDefinitions($xsd); + } + + $client->compileCalls; + my $self = { + vendor_code => $vendor_code, + password => $password, + client => $client, + }; + bless $self, $class; +} + +# internal method: returns the authentication string (referred to as the +# "hash" in the docs) + +sub _auth { + my $self = shift; + + my $now = DateTime->now; + $now->set_time_zone('UTC'); + md5_hex($self->{vendor_code} . + $self->{password} . + $now->strftime('%Y%m%d') + ); +} + +# internal method: dispatch a request to the service + +sub _call { + my $self = shift; + $self->{client}->call(@_); +} + +=item AddorUpdateCustomer OPTIONS + +Adds or updates a customer. Note the idiosyncratic capitalization; this +is the spelling of the underlying API method. OPTIONS may include: + +- PHONE_NUMBER: 10 digits, no punctuation +- FIRST_NAME: customer first name, up to 38 characters +- LAST_NAME: customer last name or company name, up to 100 characters +- STREET_NUMBER: up to 10 characters +- STREET_NAME: up to 84 characters +- CITY: up to 38 characters +- PROVINCE_STATE: 2 letter code +- POSTAL_CODE_ZIP: Canadian postal code or U.S. zip code +- OTHER_ADDRESS_INFO: up to 250 characters + +Returns a L object. + +=cut + +sub AddorUpdateCustomer { + my $self = shift; + my %opt = @_; + my %customer = map { $_ => $opt{$_} } + qw( PHONE_NUMBER FIRST_NAME LAST_NAME STREET_NUMBER STREET_NAME + CITY PROVINCE_STATE POSTAL_CODE_ZIP OTHER_ADDRESS_INFO + ); + # according to Northern 911 support, this is for a future feature, + # and should always be 'N' for now + $customer{ENHANCED_CAPABLE} = 'N'; + + $customer{VENDOR_CODE} = $self->{vendor_code}; + + my ($answer, $trace) = $self->_call( 'AddorUpdateCustomer', + hash => $self->_auth, + customer => \%customer, + ); + + WebService::Northern911::Response->new($answer); +} + +=item DeleteCustomer PHONE + +Deletes a customer record. PHONE must be the phone number (10 digits, +as in C). + +=cut + +sub DeleteCustomer { + my $self = shift; + my $phone = shift; + + my ($answer, $trace) = $self->_call( 'DeleteCustomer', + vendorCode => $self->{vendor_code}, + hash => $self->_auth, + phoneNumber => $phone, + ); + + WebService::Northern911::Response->new($answer); +} + +=item QueryCustomer PHONE + +Queries a customer record. PHONE must be the phone number. The response +object will have a "customer" method which returns a hashref of customer +information, in the same format as the arguments to C. + +=cut + +sub QueryCustomer { + my $self = shift; + my $phone = shift; + + my ($answer, $trace) = $self->_call( 'QueryCustomer', + vendorCode => $self->{vendor_code}, + hash => $self->_auth, + phoneNumber => $phone, + ); + + WebService::Northern911::Response->new($answer); +} + +=item GetVendorDumpURL + +Returns a URL to download a CSV dump of your customer data. The response +object will have a 'url' method to return the URL. + +Note that this feature is heavily throttled (at most once per week, unless +you pay for more frequent access) and the URL can only be used once. + +=cut + +sub GetVendorDumpURL { + my $self = shift; + + my ($answer, $trace) = $self->_call( 'GetVendorDumpURL', + vendorCode => $self->{vendor_code}, + hash => $self->_auth, + ); + + WebService::Northern911::Response->new($answer); +} + +=back + +=head1 AUTHOR + +Mark Wells, + +Commercial support is available from Freeside Internet Services, Inc. + +=head1 COPYRIGHT + +Copyright (c) 2014 Mark Wells + +=cut + +1; diff --git a/lib/WebService/Northern911/Response.pm b/lib/WebService/Northern911/Response.pm new file mode 100644 index 0000000..f21eab1 --- /dev/null +++ b/lib/WebService/Northern911/Response.pm @@ -0,0 +1,88 @@ +package WebService::Northern911::Response; + +use strict; + +sub new { + my $class = shift; + my $self; + + my $tree = shift; + $tree = $tree->{'parameters'} if exists $tree->{'parameters'}; + my ($key) = grep /Result$/, keys(%$tree); # should only ever be one key + $tree = $tree->{$key} or die "can't parse transaction result"; + + my $error_message = join("\n", + map { $_->{ErrorMessage} } + @{ $tree->{Errors}{Error} } + ); + + $self = { + is_success => $tree->{Accepted}, + error_message => $error_message, + }; + + if ( $key eq 'QueryCustomerResult' ) { + if ($tree->{Accepted}) { + $self->{customer} = $tree->{Customer}; + } elsif ( $tree->{Errors}{Error}[0]{ErrorCode} == 101 ) { + # 101 = Customer does not exist. But the query was successful... + $self->{is_success} = 1; + } + } elsif ( $key eq 'GetVendorDumpURL' ) { + $self->{url} = $tree->{VendorDumpURL}; + } + + bless $self, $class; +} + +sub is_success { + $_[0]->{is_success}; +} + +sub error_message { + $_[0]->{error_message}; +} + +sub customer { + $_[0]->{customer}; +} + +sub url { + $_[0]->{url}; +} + +=head1 NAME + +WebService::Northern911::Response - Response object returned by +WebService::Northern911 API calls + +=head1 METHODS + +=over 4 + +=item is_success + +1 if the API method was a success, 0 if not. If it's 0, C +will contain any error returned. Note that we report the C +method as a success if it returns a negative result; in that case, +C will be undef. + +=item error_message + +Any error messages returned from the web service, separated by newlines. + +=item customer + +For C calls, returns a hashref of the customer information +per the field names used by C. + +=item url + +For C calls, returns the URL where the data dump can be +downloaded. + +=back + +=cut + +1; diff --git a/share/schema/live/wsdl b/share/schema/live/wsdl new file mode 100644 index 0000000..ff805d7 --- /dev/null +++ b/share/schema/live/wsdl @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/schema/live/xsd0 b/share/schema/live/xsd0 new file mode 100644 index 0000000..c30e001 --- /dev/null +++ b/share/schema/live/xsd0 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/schema/live/xsd1 b/share/schema/live/xsd1 new file mode 100644 index 0000000..5c1344c --- /dev/null +++ b/share/schema/live/xsd1 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/schema/live/xsd2 b/share/schema/live/xsd2 new file mode 100644 index 0000000..7c83a0e --- /dev/null +++ b/share/schema/live/xsd2 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/schema/test/wsdl b/share/schema/test/wsdl new file mode 100644 index 0000000..c5ba956 --- /dev/null +++ b/share/schema/test/wsdl @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/schema/test/xsd0 b/share/schema/test/xsd0 new file mode 100644 index 0000000..be55868 --- /dev/null +++ b/share/schema/test/xsd0 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/schema/test/xsd1 b/share/schema/test/xsd1 new file mode 100644 index 0000000..5c1344c --- /dev/null +++ b/share/schema/test/xsd1 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/share/schema/test/xsd2 b/share/schema/test/xsd2 new file mode 100644 index 0000000..7c83a0e --- /dev/null +++ b/share/schema/test/xsd2 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/t/00-load.t b/t/00-load.t new file mode 100644 index 0000000..adcfbef --- /dev/null +++ b/t/00-load.t @@ -0,0 +1,13 @@ +#!perl -T +use 5.006; +use strict; +use warnings FATAL => 'all'; +use Test::More; + +plan tests => 1; + +BEGIN { + use_ok( 'WebService::Northern911' ) || print "Bail out!\n"; +} + +diag( "Testing WebService::Northern911 $WebService::Northern911::VERSION, Perl $], $^X" ); diff --git a/t/manifest.t b/t/manifest.t new file mode 100644 index 0000000..6ddfe36 --- /dev/null +++ b/t/manifest.t @@ -0,0 +1,15 @@ +#!perl -T +use 5.006; +use strict; +use warnings FATAL => 'all'; +use Test::More; + +unless ( $ENV{RELEASE_TESTING} ) { + plan( skip_all => "Author tests not required for installation" ); +} + +my $min_tcm = 0.9; +eval "use Test::CheckManifest $min_tcm"; +plan skip_all => "Test::CheckManifest $min_tcm required" if $@; + +ok_manifest(); diff --git a/t/pod.t b/t/pod.t new file mode 100644 index 0000000..a0054e9 --- /dev/null +++ b/t/pod.t @@ -0,0 +1,12 @@ +#!perl -T +use 5.006; +use strict; +use warnings FATAL => 'all'; +use Test::More; + +# Ensure a recent version of Test::Pod +my $min_tp = 1.22; +eval "use Test::Pod $min_tp"; +plan skip_all => "Test::Pod $min_tp required for testing POD" if $@; + +all_pod_files_ok(); -- 2.11.0