Imported Upstream version 0.21
[liburi-template-perl.git] / lib / URI / Template.pm
index 390f6a6..0069457 100644 (file)
@@ -3,7 +3,7 @@ package URI::Template;
 use strict;
 use warnings;
 
-our $VERSION = '0.17';
+our $VERSION = '0.21';
 
 use URI;
 use URI::Escape        ();
@@ -24,7 +24,8 @@ my %TOSTRING = (
 
 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;
@@ -123,10 +124,7 @@ sub _tostring_query {
     $join = '&' if $exp->{ op } =~ /[?&]/;
 
     if ( ref $value eq 'ARRAY' ) {
-        if( !@$value ) {
-            return if $var->{ explode };
-            return $var->{ name } . '=';
-        }
+        return if !@$value;
         if ( $var->{ explode } ) {
             return join( $join,
                 map { $var->{ name } . '=' . _quote( $_, $safe ) } @$value );
@@ -137,10 +135,7 @@ sub _tostring_query {
         }
     }
     elsif ( ref $value eq 'HASH' ) {
-        if( !keys %$value ) {
-            return if $var->{ explode };
-            return $var->{ name } . '=';
-        }
+        return if !keys %$value;
         if ( $var->{ explode } ) {
             return join(
                 $join,
@@ -204,15 +199,16 @@ sub _tostring_path {
 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 =~ /^([+#.\/;?&|!\@])(.+)/ ) {
@@ -239,7 +235,7 @@ sub _compile_expansion {
 
         # remove "optional" flag (for opensearch compatibility)
         $var{ name } =~ s{\?$}{};
-        $self->{ _vars }->{ $var{ name } }++;
+        $self->{ _vars }->{ $var{ name } } = $pos;
 
         push @{ $exp{ vars } }, \%var;
     }
@@ -292,11 +288,22 @@ sub _compile_expansion {
 }
 
 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 {
@@ -334,14 +341,22 @@ URI::Template - Object for handling URI templates (RFC 6570)
 =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
 
@@ -355,15 +370,16 @@ http://tools.ietf.org/html/rfc6570
 =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
 
@@ -393,7 +409,7 @@ URI object.
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2007-2013 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.