Acme-URL
view release on metacpan or search on metacpan
lib/Acme/URL.pm view on Meta::CPAN
package Acme::URL;
use strict;
use warnings;
use 5.008001;
use Devel::Declare ();
use LWP::Simple ();
use base 'Devel::Declare::Context::Simple';
our $VERSION = '0.01';
sub import {
my $class = shift;
my $caller = caller;
my $ctx = __PACKAGE__->new;
Devel::Declare->setup_for(
$caller,
{
http => {
const => sub { $ctx->parser(@_) },
},
},
);
no strict 'refs';
*{$caller.'::http'} = sub ($) { LWP::Simple::get( $_[0] ) };
}
sub parser {
my $self = shift;
$self->init(@_);
$self->skip_declarator; # skip past "http"
my $line = $self->get_linestr; # get me current line of code
my $pos = $self->offset; # position just after "http"
my $url = substr $line, $pos; # url & everything after "http"
for my $c (split //, $url) {
# if blank, semicolon, closing parenthesis or a comma(!) then no longer a URL
last if $c eq q{ };
last if $c eq q{;};
last if $c eq q{)};
last if $c eq q{,};
$pos++;
}
# wrap the url with http() sub and quotes
substr( $line, $pos, 0 ) = q{")};
substr( $line, $self->offset, 0 ) = q{("http};
# pass back changes to parser
$self->set_linestr( $line );
return;
}
1;
__END__
=head1 NAME
Acme::URL - Bareword URL with HTTP request
=head1 VERSION
Version 0.01
=head1 SYNOPSIS
URL without any strings attached performing a HTTP request returning the content:
use Modern::Perl;
use JSON qw(decode_json);
use Acme::URL;
# print the json
say http://twitter.com/statuses/show/6592721580.json;
# => "He nose the truth."
say decode_json( http://twitter.com/statuses/show/6592721580.json )->{text};
=head1 DESCRIPTION
See L<http://transfixedbutnotdead.com/2009/12/16/url-develdeclare-and-no-strings-attached/>
NB. This module is just a play thing and just intended as an investigation into using L<Devel::Declare>.
So go play with it and don't do anything stupid with it :)
=head1 EXPORT
=head2 http()
NB. Devel::Declare will always trigger the bareword http
( run in 0.601 second using v1.01-cache-2.11-cpan-2398b32b56e )