33cbd0aab9a1436a43d05c152b86b67c6efce94c
[libwww-opensearch-perl.git] / lib / WWW / OpenSearch / Url.pm
1 package WWW::OpenSearch::Url;\r
2 \r
3 use base qw( Class::Accessor::Fast );\r
4 \r
5 use URI;\r
6 use URI::Escape;\r
7 \r
8 __PACKAGE__->mk_accessors( qw( type template method params macros ) );\r
9 \r
10 =head1 NAME\r
11 \r
12 WWW::OpenSearch::Url\r
13 \r
14 =head1 SYNOPSIS\r
15 \r
16 =head1 DESCRIPTION\r
17 \r
18 =head1 CONSTRUCTOR\r
19 \r
20 =head2 new( [%options] )\r
21 \r
22 =head1 METHODS\r
23 \r
24 =head2 parse_macros( )\r
25 \r
26 =head2 prepare_query( [ \%params ] )\r
27 \r
28 =head1 ACCESSORS\r
29 \r
30 =head1 AUTHOR\r
31 \r
32 =over 4\r
33 \r
34 =item * Tatsuhiko Miyagawa E<lt>miyagawa@bulknews.netE<gt>\r
35 \r
36 =item * Brian Cassidy E<lt>bricas@cpan.orgE<gt>\r
37 \r
38 =back\r
39 \r
40 =head1 COPYRIGHT AND LICENSE\r
41 \r
42 Copyright 2006 by Tatsuhiko Miyagawa and Brian Cassidy\r
43 \r
44 This library is free software; you can redistribute it and/or modify\r
45 it under the same terms as Perl itself. \r
46 \r
47 =cut\r
48 \r
49 sub new {\r
50     my( $class, %options ) = @_;\r
51     \r
52     $options{ method } ||= 'GET';\r
53     $options{ template } = URI->new( $options{ template } );\r
54     \r
55     my $self = $class->SUPER::new( \%options );
56     $self->parse_macros;\r
57
58     return $self;\r
59 }\r
60 \r
61 sub parse_macros {\r
62     my $self = shift;\r
63     \r
64     my %query = $self->method eq 'post'
65         ? %{ $self->params }
66         : $self->template->query_form;\r
67     \r
68     my %macros;\r
69     for( keys %query ) {\r
70         if( $query{ $_ } =~ /^{(.+)}$/ ) {\r
71             $macros{ $1 } = $_;\r
72         }\r
73     }\r
74     \r
75     $self->macros( \%macros );\r
76 }\r
77 \r
78 sub prepare_query {\r
79     my( $self, $params ) = @_;\r
80     my $url   = $self->template->clone;\r
81     \r
82     $params->{ startIndex     } ||= 1;\r
83     $params->{ startPage      } ||= 1;\r
84     $params->{ language       } ||= '*';\r
85     $params->{ outputEncoding } ||= 'UTF-8';\r
86     $params->{ inputEncoding  } ||= 'UTF-8';\r
87     \r
88     my $macros = $self->macros;\r
89
90     # attempt to handle POST
91     if( $self->method eq 'post' ) {
92         my $post = $self->params;
93         for( keys %macros ) {
94             $post->{ $macros->{ $_ } } = $params->{ $_ };\r
95         }
96         return [ $url, $post ];
97     }
98
99     my $query = { $url->query_form };\r
100     for( keys %$macros ) {\r
101         $query->{ $macros->{ $_ } } = $params->{ $_ };\r
102     }\r
103     \r
104     $url->query_form( $query );\r
105     return $url;\r
106 }\r
107 \r
108 1;\r