X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2FURI%2FTemplate.pm;h=0069457833bc5539af1935e4a55ca7442a7d5a4d;hb=refs%2Ftags%2Fupstream%2F0.21;hp=54a73acf3d0b21e8664aee4ec53d340f956f4266;hpb=5ea1ac36de0445293009b06d3a28620e63f92916;p=liburi-template-perl.git diff --git a/lib/URI/Template.pm b/lib/URI/Template.pm index 54a73ac..0069457 100644 --- a/lib/URI/Template.pm +++ b/lib/URI/Template.pm @@ -3,7 +3,7 @@ package URI::Template; use strict; use warnings; -our $VERSION = '0.18'; +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; @@ -198,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 =~ /^([+#.\/;?&|!\@])(.+)/ ) { @@ -233,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; } @@ -286,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 { @@ -328,8 +341,16 @@ 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 @@ -349,15 +370,16 @@ L<< http://tools.ietf.org/html/rfc6570 >>. =head2 new( $template ) Creates a new L 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 @@ -387,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.