The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package WWW::TextMarks;

use 5.008000;
use strict;
use warnings;
use LWP::Simple;
use XML::Simple;

our $VERSION = '0.01';

=head1 NAME

WWW::TextMarks - Provides access to the TextMarks SMS Service V2 API

=head1 SYNOPSIS

  use WWW::TextMarks;
  my $tm = WWW::TextMarks->new(
    apik => 'example_com_12345678',
    user => '5556781234',
    pass => 'y0ur$ekretPassword',
    tm   => 'yourtextmark',
  );
  my $res = $tm->send('5559994321', 'Hey, pick up your dry cleaning.');
  if ($res->{success})
  {
    print "Yippie.\n";
  }
  else
  {
    print "Error: $res->{error}\n";
  }

=head1 DESCRIPTION

WWW::TextMarks provides access to the TextMarks SMS Service V2 API.

Currently, it only allows you to send text messages to individual subscribers.
Eventually, it'll also allow you to maintain your subscriber list and perform
the full set of tasks made available by the TextMarks API.

Patches are welcome in case you get to it before I do.  :-)

=head1 METHODS

=head2 new

See SYNOPSIS above for an example.

Required: apik, user, pass, tm.
Optional: url

Setting the C<url> is not recommended unless the embedded URL in this module
fails to work properly or if you require an alternate URL provided by TextMarks.

The C<apik> is created by registering for an API key at:
L<http://www.textmarks.com/dev/api/reg/?ref=devapi>

The C<user> and C<pass> is your TextMarks website login username and password.
Your username is most likely your cell phone number.

=cut

sub new
{
  my $self = bless({}, shift);
  my %opts = @_;
  $self->{url} = $opts{url} || 'http://dev1.api.textmarks.com/Messaging/sendText/?apik=%%apik%%&auth_user=%%user%%&auth_pass=%%pass%%&tm=%%tm%%&to=%%phone%%&msg=%%message%%';
  $self->{apik} = $opts{apik}; # http://www.textmarks.com/dev/api/reg/?ref=devapi
  $self->{user} = $opts{user}; # textmarks username
  $self->{pass} = $opts{pass}; # textmarks password
  $self->{tm} = $opts{tm}; # textmark
  return $self;
}

=head2 send

See SYNOPSIS above for an example.

The first argument is the SMS recipient's phone number.  The second argument is
the message to send.  There are no other arguments.

If you wish to send to many recipients, just call C<send> multiple times, once
per recipient.

=cut

sub send
{
  my $self = shift;
  my $phone = shift;
  my $message = shift;
  $message =~ s/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg;
  my $url = $self->{url};
  $url =~ s/(%%([^%]+)%%)/$self->{$2}||$1/eg;
  $url =~ s/%%phone%%/$phone/g;
  $url =~ s/%%message%%/$message/g;
  my $response = get($url);
  my $resxml = {
    error => 'Response parser error',
    response => $response,
  };
  eval
  {
    $resxml = XMLin($response);
  };
  $resxml->{success} = ($resxml->{TMHead}->{ResMsg} eq 'Success' || 0);
  $resxml->{error} = $resxml->{TMHead}->{ResMsg} unless $resxml->{success};
  return $resxml;
}

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2009 by Dusty Wilson, E<lt>dusty@megagram.comE<gt>

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.0 or,
at your option, any later version of Perl 5 you may have available.
=cut

1;