#!/usr/bin/perl

use 5.006;
use strict;
use warnings;
use Getopt::Long 'GetOptions';
use Try::Tiny qw(try catch);
use utf8;

# modernize Getopt::Long
Getopt::Long::Configure(qw(default gnu_getopt no_auto_abbrev no_ignore_case));
GetOptions('s|service=s' => \my $service, 'l' => \my $long,);

# eval in case we don't have Config::Auto installed
my $config = try {
    require Config::Auto;
    return Config::Auto::parse();
}
catch {
    warn "You must have Config::Auto in order to use a config file\n"
        unless $_ =~ /No config file/;
    {};
};

# Determine our service, default is TinyURL
$service = $service || $ENV{SHORTEN_SERVICE} || $config->{service} || 'TinyURL';
$service = "WWW::Shorten::$service" unless $service =~ /^WWW::Shorten/;

# Import it
try {
    (my $mod = $service) =~ s/::/\//g;
    require "$mod.pm";
}
catch {
    die "Error trying to use $service: $_\n";
};

# determine the method to use;
my $method = $long ? 'makealongerlink' : 'makeashorterlink';
die "Sorry, $service can't $method\n"
    unless (my $call = $service->can($method));

# Get argument
my $url = shift(@ARGV) || '';
die "No URL specified!\n" unless $url;
unless ($long) {
    $url = "http://$url" unless $url =~ m[^\w+://];
}

my $out = try {
    $call->($url);
}
catch {
    die "Error: $_\n";
};

# Output
$out = $out || 'Error';
print "$out\n";

__END__

=head1 NAME

shorten - CLI program to demonstrate use of WWW::Shorten

=head1 SYNOPSIS

    # Default shortening service is Metamark
    $ shorten books.perl.org/book/171
    http://xrl.us/dv8

    # Change with an environment variable
    $ SHORTEN_SERVICE=TinyURL shorten books.perl.org/book/171
    http://tinyurl.com/ye7gjf4

    # Change with command line option
    $ shorten --service=TinyURL books.perl.org/book/171
    http://tinyurl.com/ye7gjf4

    # Change using config file
    $ cat ~/.shortenrc
    service = TinyURL
    $ shorten books.perl.org/book/171
    http://tinyurl.com/ye7gjf4

    # Lengthen a URL
    $ shorten -l http://tinyurl.com/ye7gjf4

=head1 CONFIGURATION

The service used can be controlled in various ways. The program will
use the first of the following values that it finds:

=over

=item *

The value of the C<--service> command line option.

=item *

The value of the C<SHORTEN_SERVICE> environment variable.

=item *

The value of the C<service> option from the configuration file (see
below).

=item *

If none of the above options is found, the program defaults to using
Metamark.

=back

=head1 CONFIGURATION FILE

As we use the C<Config::Auto> module for configuration, shorten's
fairly flexible when it comes to format.

Configuration will be found in whichever of the following files
comes first.

    shortenconfig
    ~/shortenconfig
    /etc/shortenconfig
    shorten.config
    ~/shorten.config
    /etc/shorten.config
    shortenrc
    ~/shortenrc
    /etc/shortenrc
    .shortenrc
    ~/.shortenrc
    /etc/.shortenrc

Generally, I use the format:

    service = MakeAShorterLink

which is simple and works. C<service> is the only configuration keyword
at present. Its value should be a correctly capitalized service name as
per L<WWW::Shorten>'s documentation.

=head1 LICENSE AND COPYRIGHT

Copyright 2002 - 2010, Magnum Solutions Ltd. All rights reserved.

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=head1 AUTHOR

Iain Truskett <spoon@cpan.org>

=head1 CONTRIBUTORS

=over

=item *

Chase Whitener C<capoeirab@cpan.org>

=item *

Dave Cross <davecross@cpan.org>

=back

=head1 SEE ALSO

L<WWW::Shorten>

=cut
