use strict;
use warnings;
-our $VERSION = '0.16';
+our $VERSION = '0.21';
use URI;
use URI::Escape ();
sub new {
my $class = shift;
- my $templ = shift || die 'No template provided';
+ my $templ = shift;
+ $templ = '' unless defined $templ;
my $self = bless { template => $templ, _vars => {} } => $class;
$self->_study;
$join = '&' if $exp->{ op } =~ /[?&]/;
if ( ref $value eq 'ARRAY' ) {
- return unless @$value;
+ return if !@$value;
if ( $var->{ explode } ) {
return join( $join,
map { $var->{ name } . '=' . _quote( $_, $safe ) } @$value );
}
}
elsif ( ref $value eq 'HASH' ) {
- return unless keys %$value;
+ return if !keys %$value;
if ( $var->{ explode } ) {
return join(
$join,
sub _study {
my ( $self ) = @_;
my @hunks = grep { defined && length } split /(\{.+?\})/, $self->template;
+ my $pos = 1;
for ( @hunks ) {
next unless /^\{(.+?)\}$/;
- $_ = $self->_compile_expansion( $1 );
+ $_ = $self->_compile_expansion( $1, $pos++ );
}
$self->{ studied } = \@hunks;
}
sub _compile_expansion {
- my ( $self, $str ) = @_;
+ my ( $self, $str, $pos ) = @_;
my %exp = ( op => '', vars => [], str => $str );
if ( $str =~ /^([+#.\/;?&|!\@])(.+)/ ) {
# remove "optional" flag (for opensearch compatibility)
$var{ name } =~ s{\?$}{};
- $self->{ _vars }->{ $var{ name } }++;
+ $self->{ _vars }->{ $var{ name } } = $pos;
push @{ $exp{ vars } }, \%var;
}
}
sub template {
- return $_[ 0 ]->{ template };
+ my $self = shift;
+ my $templ = shift;
+
+ # Update template
+ if ( defined $templ && $templ ne $self->{ template } ) {
+ $self->{ template } = $templ;
+ $self->{ _vars } = {};
+ $self->_study;
+ return $self;
+ }
+
+ return $self->{ template };
}
sub variables {
- return keys %{ $_[ 0 ]->{ _vars } };
+ return sort {$_[ 0 ]->{ _vars }->{ $a } <=> $_[ 0 ]->{ _vars }->{ $b } } keys %{ $_[ 0 ]->{ _vars } };
}
sub expansions {
=head1 SYNOPSIS
use URI::Template;
+
my $template = URI::Template->new( 'http://example.com/{x}' );
my $uri = $template->process( x => 'y' );
+
+ # or
+
+ my $template = URI::Template->new();
+ $template->template( 'http://example.com/{x}' );
+ my $uri = $template->process( x => 'y' );
+
# uri is a URI object with value 'http://example.com/y'
=head1 DESCRIPTION
This module provides a wrapper around URI templates as described in RFC 6570:
-http://tools.ietf.org/html/rfc6570
+L<< http://tools.ietf.org/html/rfc6570 >>.
=head1 INSTALLATION
=head2 new( $template )
Creates a new L<URI::Template> instance with the template passed in
-as the first parameter.
+as the first parameter (optional).
-=head2 template
+=head2 template( $template )
-This method returns the original template string.
+This method returns the original template string. If provided, it will also set and parse a
+new template string.
=head2 variables
-Returns an array of unique variable names found in the template. NB: they are returned in random order.
+Returns an array of unique variable names found in the template (in the order of appearance).
=head2 expansions
=head1 COPYRIGHT AND LICENSE
-Copyright 2007-2012 by Brian Cassidy
+Copyright 2007-2015 by Brian Cassidy
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.