File Coverage

blib/lib/XML/Template/Base.pm
Criterion Covered Total %
statement 4 6 66.6
branch n/a
condition n/a
subroutine 2 2 100.0
pod n/a
total 6 8 75.0


line stmt bran cond sub pod time code
1             ###############################################################################
2             # XML::Template::Base
3             #
4             # Copyright (c) 2002-2003 Jonathan A. Waxman
5             # All rights reserved.
6             #
7             # This program is free software; you can redistribute it and/or modify it
8             # under the same terms as Perl itself.
9             ###############################################################################
10             package XML::Template::Base;
11              
12 2     2   12 use strict;
  2         4  
  2         79  
13 2     2   1402 use XML::Template::Config;
  0            
  0            
14              
15              
16             my $SOURCE = {};
17              
18             =pod
19              
20             =head1 NAME
21              
22             XML::Template::Base - Base class for XML::Template modules.
23              
24             =head1 SYNOPSIS
25              
26             use base qw(XML::Template::Base);
27             use XML::Template::Base;
28              
29             =head1 DESCRIPTION
30              
31             This module is the XML::Template base class. It implements common
32             functionality for many other XML::Template modules, including construction
33             and error handling.
34              
35             =head1 CONSTRUCTOR
36              
37             XML::Template::Base provides a common constructor for XML::Template
38             modules. The constructor creates a new self and calls an initialization
39             method. If the derived class does not have its own initialization
40             subroutine, XML::Template::Base provides one that simply returns true.
41              
42             The following named configuration parameters are supported:
43              
44             =over 4
45              
46             =item Debug
47              
48             Set to true to turn on printing debug information. Not really supported.
49              
50             =item HTTPHost
51              
52             The hostname of the requesting server. The default value is set to the
53             environment variable C. If this is not set (for instance, if
54             running on the command line), the default is C.
55              
56             =item Config
57              
58             A reference to an XML::GDOME object that contains XML::Template
59             configuration information. See L.
60              
61             =back 4
62              
63             =cut
64              
65             sub new {
66             # Due to the force of karma, we take rebirth.
67             my $proto = shift;
68              
69             # Due to ignorance, a self is fabricated.
70             my $self = {};
71              
72             # Due to karmic imprints on our consciousness, name and form arise.
73             my $class = ref ($proto) || $proto;
74             bless ($self, $class);
75              
76             # There is contact between the sense organs and consciousness.
77             my %params = @_;
78              
79             # Contact is the basis for feelings.
80             $self->{_debug} = $params{Debug} if defined $params{Debug};
81             $self->{_hostname} = $params{HTTPHost}
82             || $ENV{HTTP_HOST}
83             || XML::Template::Config->hostname
84             || return $proto->error (XML::Template::Config->error);
85             $self->{_config} = $params{Config}
86             || XML::Template::Config->config
87             || return $proto->error (XML::Template::Config->error);
88             $self->{_source} = $SOURCE;
89              
90             # We become attached to what feels good; attachment and craving lead
91             # to becoming and birth.
92             return $self->_init (%params) ? $self
93              
94             # Eventually we grow old and die.
95             : $proto->error ($self->error);
96             }
97              
98             =pod
99              
100             =head1 PRIVATE METHODS
101              
102             =head2 _init
103              
104             XML::Template::Base provides an initialization function that simply
105             returns 1. This is required for modules that use XML::Template::Base as a
106             base class, but do not require an initialization function.
107              
108             =cut
109              
110             sub _init {
111             my $self = shift;
112              
113             return 1;
114             }
115              
116             =pod
117              
118             =head1 PUBLIC METHODS
119              
120             =head2 error
121              
122             return $self->error ($type, $error);
123             my ($type, $error) = $self->error;
124             print $self->error;
125              
126             XML::Template::Base provides the method C to do simple error
127             handling. If no parameters are given, the currently stored error type and
128             message are returned. If parameters for the error type and message are
129             given, they are stored as the current error.
130              
131             C may be called as a package method (e.g.,
132             Cerror ($error);> or as an object method
133             (e.g., C<$xml_template-Eerror ($error);>. If it is called as a
134             package method, the error is stored as a package variable. If it is
135             called as an object method, the error is stored as a private variable.
136              
137             =cut
138              
139             sub error {
140             my $self = shift;
141             my ($type, $error) = @_;
142              
143             # If an error given, set it in the object or package.
144             # Otherwise, return the error from the object or package.
145             if (defined $type) {
146             ref ($self) ? $self->{_error} = [$type, $error]
147             : $self::_error = [$type, $error];
148             return undef;
149             } else {
150             if (wantarray) {
151             return ref ($self) ? @{$self->{_error}} : @{$self::_error};
152             } else {
153             if (ref ($self)) {
154             return defined $self->{_error}->[0]
155             ? "$self->{_error}->[0]: $self->{_error}->[1]"
156             : undef;
157             } else {
158             return defined $self::_error->[0]
159             ? "$self::_error->[0]: $self::_error->[1]"
160             : undef;
161             }
162             }
163             }
164             }
165              
166             =pod
167              
168             =head2 get_info
169              
170             my $host_info = $self->get_info ("/xml-template/hosts/host[\@name='$name']",
171             'basedir', 'domain');
172              
173             This method returns a hash containing name/value pairs from the
174             XML::Template configuration file. The first parameter is an XPath query
175             that returns the XML subtree containing the desired configuration
176             information. The remaining parameters name the child elements of the
177             configuration subtree whose values you wish returned in the hash. This
178             method is wrapped by more specific subroutines, for instance,
179             get_host_info, get_subroutine_info, get_namespace_info, etc. See
180             L for more details on the XML::Template
181             configuration file.
182              
183             =cut
184            
185             sub get_info {
186             my $self = shift;
187             my ($query, @elements) = @_;
188              
189             my ($node) = $self->{_config}->findnodes ($query);
190             if (defined $node) {
191             my (%info, @info);
192             foreach my $el (@elements) {
193             my @nodes = $self->{_config}->findnodes ("$query/$el");
194             if (scalar (@nodes) == 1) {
195             if (wantarray) {
196             push (@info, $nodes[0]->string_value);
197             } else {
198             $info{$el} = $nodes[0]->string_value;
199             }
200             } elsif (scalar (@nodes) > 1) {
201             my @values;
202             foreach my $node (@nodes) {
203             push (@values, $node->string_value);
204             }
205             if (wantarray) {
206             push (@info, \@values);
207             } else {
208             push (@{$info{$el}}, \@values);
209             }
210             }
211             }
212              
213             return wantarray ? @info : \%info;
214             }
215              
216             return undef;
217             }
218              
219             =pod
220              
221             =head2 get_host_info
222              
223             my $host_info = $self->get_host_info ($hostname);
224             my $host_info = $self->get_host_info ($hostname, 'domain');
225              
226             This method returns a hash of name/value pairs of hostname information
227             from the XML::Template configuration file. The first parameter is the
228             name of the host for which information is desired. The remaining
229             parameters name the configuration elements to include in the hash. If no
230             such parameters are given, all host configuration elements are included.
231             Currently, this includes C and C.
232              
233             =cut
234              
235             sub get_host_info {
236             my $self = shift;
237             my ($name, @elements) = @_;
238              
239             @elements = qw(basedir domain) if ! scalar (@elements);
240             return $self->get_info (
241             "/xml-template/hosts/host[\@name='$name']",
242             @elements);
243             }
244              
245             =pod
246              
247             =head2 get_source_mapping_info
248              
249             my $get_source_mapping_info = $self->get_source_mapping_info (
250             namespace => $namespace);
251             my $get_source_mapping_info = $self->get_source_mapping_info (
252             namespace => $namespace,
253             'source');
254              
255             This method returns a hash of name/value pairs of source mapping
256             two parameters give the resource type and name of the source mapping for
257             which information is desired. The remaining parameters name the
258             configuration elements to include in the hash. If no such parameters are
259             given, all source mapping configuration elements are included.
260             Currently, this includes C, C, C, and C.
261             The element C is a hash of related namespace name/table pairs.
262              
263             =cut
264              
265             sub get_source_mapping_info {
266             my $self = shift;
267             my ($type, $name, @elements) = @_;
268              
269             my @telements = qw(source table keys) if ! scalar (@elements);
270             my $source_info = $self->get_info (
271             "/xml-template/source-mappings/source-mapping[\@$type='$name']",
272             @telements);
273              
274             my %elements = map { $_ => 1 } @elements;
275             if (! scalar (@elements) || $elements{relation}) {
276             my @nodes = $self->{_config}->findnodes (
277             "/xml-template/source-mappings/source-mapping[\@$type='$name']/relation/\@namespace");
278             foreach my $node (@nodes) {
279             my $namespace = $node->string_value;
280             $source_info->{relation}->{$namespace} = $self->get_info (
281             "/xml-template/source-mappings/source-mapping[\@$type='$name']/relation[\@namespace='$namespace']",
282             'table');
283             }
284             }
285              
286             return $source_info;
287             }
288              
289             =pod
290              
291             =head2 get_source_info
292              
293             my $source_info = $self->get_source_info ($sourcename);
294             my $source_info = $self->get_source_info ($sourcename, 'module');
295              
296             This method returns a hash of name/value pairs of source information from
297             the XML::Template configuration file. The first parameter is the name of
298             the source for which information is desired. The remaining parameters
299             name the configuration elements to include in the hash. If no such
300             parameters are given, all host configuration elements are included.
301             Currently, this includes C, C, C, and C.
302              
303             =cut
304              
305             sub get_source_info {
306             my $self = shift;
307             my ($name, @elements) = @_;
308              
309             @elements = qw(module dsn user pwdfile) if ! scalar (@elements);
310             return $self->get_info (
311             "/xml-template/sources/source[\@name='$name']",
312             @elements);
313             }
314              
315             =pod
316              
317             =head2 get_source
318              
319             my $source = $self->get_source ($sourcename);
320              
321             This method returns the data source named by the parameter from the
322             XML::Template configuration file.
323              
324             Data source references are stored in a cache. If a requested data source
325             has already been loaded, the cached reference to it is returned.
326              
327             =cut
328              
329             sub get_source {
330             my $self = shift;
331             my $sourcename = shift;
332              
333             my $source;
334             if (defined $sourcename) {
335             # If source already requested, return stored reference.
336             if (defined $self->{_source}->{$sourcename}) {
337             $source = $self->{_source}->{$sourcename};
338              
339             # Create and return a reference to a source object.
340             } else {
341             my $sourceinfo = $self->get_source_info ($sourcename, 'module');
342             if (defined $sourceinfo) {
343             # Load the source module.
344             my $module = $sourceinfo->{module};
345             XML::Template::Config->load ($module)
346             || return $self->error (XML::Template::Config->error);
347              
348             # Create a new data source object.
349             $source = $module->new ($sourcename)
350             || return $self->error ('Source', scalar ($module->error ()));
351              
352             # Cache the data source object.
353             $self->{_source}->{$sourcename} = $source;
354              
355             } else {
356             return $self->error ('Source', "Source '$sourcename' not defined.");
357             }
358             }
359             }
360              
361             return $source;
362             }
363              
364             =pod
365              
366             =head2 get_subroutine_info
367              
368             my $subroutine_info = $self->get_subroutine_info ($subname);
369             my $subroutine_info = $self->get_subroutine_info ($subname, 'module');
370              
371             This method returns a hash of name/value pairs of subroutine information
372             from the XML::Template configuration file. The first parameter is the
373             name of the subroutine for which information is desired. The remaining
374             parameters name the configuration elements to include in the hash. If no
375             such parameters are given, all host configuration elements are included.
376             Currently, this include C and C.
377              
378             =cut
379              
380             sub get_subroutine_info {
381             my $self = shift;
382             my ($name, @elements) = @_;
383              
384             @elements = qw(description module) if ! scalar (@elements);
385             return $self->get_info (
386             "/xml-template/subroutines/subroutine[\@name='$name']",
387             @elements);
388             }
389              
390             =pod
391              
392             =head2 get_namespace_info
393              
394             my $namespace_info = $self->get_namespace_info ($namespace);
395             my $namespace_info = $self->get_namespace_info ($namespace, 'title');
396              
397             This method returns a hash of name/value pairs of namespace information
398             from the XML::Template configuration file. The first parameter is the
399             name of the namespace for which information is desired. The remaining
400             parameters name the configuration elements to include in the hash. If no
401             such parameters are given, all host configuration elements are included.
402             Currently, this include C, C, C<decsritpion>, and </td> </tr> <tr> <td class="h" > <a name="403">403</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> C<module>. </td> </tr> <tr> <td class="h" > <a name="404">404</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="405">405</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="406">406</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="407">407</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub get_namespace_info { </td> </tr> <tr> <td class="h" > <a name="408">408</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $self = shift; </td> </tr> <tr> <td class="h" > <a name="409">409</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my ($name, @elements) = @_; </td> </tr> <tr> <td class="h" > <a name="410">410</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="411">411</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> @elements = qw(prefix title description module) if ! scalar (@elements); </td> </tr> <tr> <td class="h" > <a name="412">412</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return $self->get_info ( </td> </tr> <tr> <td class="h" > <a name="413">413</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> "/xml-template/namespaces/namespace[\@name='$name']", </td> </tr> <tr> <td class="h" > <a name="414">414</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> @elements); </td> </tr> <tr> <td class="h" > <a name="415">415</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="416">416</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =pod </td> </tr> <tr> <td class="h" > <a name="417">417</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="418">418</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 get_element_info </td> </tr> <tr> <td class="h" > <a name="419">419</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="420">420</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $element_info = $self->get_element_info ($namespace, $element); </td> </tr> <tr> <td class="h" > <a name="421">421</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $element_info = $self->get_element_info ($namespace, $element, </td> </tr> <tr> <td class="h" > <a name="422">422</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 'content'); </td> </tr> <tr> <td class="h" > <a name="423">423</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="424">424</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This method returns a hash of name/value pairs of element information from </td> </tr> <tr> <td class="h" > <a name="425">425</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> the XML::Template configuration file. The first two parameters, </td> </tr> <tr> <td class="h" > <a name="426">426</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> respectively, are the name of the namespace in which the element resides </td> </tr> <tr> <td class="h" > <a name="427">427</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> and the name of the element for which information is desired. The </td> </tr> <tr> <td class="h" > <a name="428">428</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> remaining parameters name the configuration elements to include in the </td> </tr> <tr> <td class="h" > <a name="429">429</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> hash. If no such parameters are given, all host configuration elements </td> </tr> <tr> <td class="h" > <a name="430">430</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> are included. Currently, this include C<content> and C<nestedin>. </td> </tr> <tr> <td class="h" > <a name="431">431</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="432">432</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="433">433</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="434">434</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub get_element_info { </td> </tr> <tr> <td class="h" > <a name="435">435</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $self = shift; </td> </tr> <tr> <td class="h" > <a name="436">436</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my ($namespace, $name, @elements) = @_; </td> </tr> <tr> <td class="h" > <a name="437">437</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="438">438</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> @elements = qw(content nestedin) if ! scalar (@elements); </td> </tr> <tr> <td class="h" > <a name="439">439</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return $self->get_info ( </td> </tr> <tr> <td class="h" > <a name="440">440</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> "/xml-template/namespaces/namespace[\@name='$namespace']/element[\@name='$name']", </td> </tr> <tr> <td class="h" > <a name="441">441</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> @elements); </td> </tr> <tr> <td class="h" > <a name="442">442</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="443">443</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="444">444</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =pod </td> </tr> <tr> <td class="h" > <a name="445">445</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="446">446</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 get_attribs </td> </tr> <tr> <td class="h" > <a name="447">447</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="448">448</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $attribs = $self->get_attribs ($namespace, $element, $attrib); </td> </tr> <tr> <td class="h" > <a name="449">449</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="450">450</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This method returns an array of attribute names for an element. The first </td> </tr> <tr> <td class="h" > <a name="451">451</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> parameter specifies the namespace in which the element resides. The </td> </tr> <tr> <td class="h" > <a name="452">452</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> second parameter is the name of the element. </td> </tr> <tr> <td class="h" > <a name="453">453</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="454">454</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="455">455</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="456">456</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub get_attribs { </td> </tr> <tr> <td class="h" > <a name="457">457</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $self = shift; </td> </tr> <tr> <td class="h" > <a name="458">458</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my ($namespace, $element) = @_; </td> </tr> <tr> <td class="h" > <a name="459">459</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="460">460</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my @attribs; </td> </tr> <tr> <td class="h" > <a name="461">461</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my @nodes = $self->{_config}->findnodes ("/xml-template/namespaces/namespace[\@name='$namespace']/element[\@name='$element']/attrib/\@name"); </td> </tr> <tr> <td class="h" > <a name="462">462</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> foreach my $node (@nodes) { </td> </tr> <tr> <td class="h" > <a name="463">463</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> push (@attribs, $node->string_value); </td> </tr> <tr> <td class="h" > <a name="464">464</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="465">465</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return @attribs; </td> </tr> <tr> <td class="h" > <a name="466">466</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="467">467</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return undef; </td> </tr> <tr> <td class="h" > <a name="468">468</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="469">469</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="470">470</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =pod </td> </tr> <tr> <td class="h" > <a name="471">471</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="472">472</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head2 get_attrib_info </td> </tr> <tr> <td class="h" > <a name="473">473</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="474">474</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $attrib_info = $self->get_attrib_info ($namespace, $element, $attrib); </td> </tr> <tr> <td class="h" > <a name="475">475</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $attrib_info = $self->get_attrib_info ($namespace, $element, $attrib, </td> </tr> <tr> <td class="h" > <a name="476">476</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 'parse'); </td> </tr> <tr> <td class="h" > <a name="477">477</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="478">478</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This method returns a hash of name/value pairs of attribute information </td> </tr> <tr> <td class="h" > <a name="479">479</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> from the XML::Template configuration file. The first three parameters, </td> </tr> <tr> <td class="h" > <a name="480">480</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> respectively, are the namespace in which the associated element resides, </td> </tr> <tr> <td class="h" > <a name="481">481</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> the attribute's associated element, and the name of the attribute for </td> </tr> <tr> <td class="h" > <a name="482">482</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> which information is desired. The remaining parameters name the </td> </tr> <tr> <td class="h" > <a name="483">483</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> configuration elements to include in the hash. If no such parameters are </td> </tr> <tr> <td class="h" > <a name="484">484</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> given, all host configuration elements are included. Currently, this </td> </tr> <tr> <td class="h" > <a name="485">485</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> include C<requires>, C<parse>, C<parser>, and C<type>. </td> </tr> <tr> <td class="h" > <a name="486">486</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="487">487</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="488">488</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="489">489</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> sub get_attrib_info { </td> </tr> <tr> <td class="h" > <a name="490">490</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my $self = shift; </td> </tr> <tr> <td class="h" > <a name="491">491</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> my ($namespace, $element, $name, @elements) = @_; </td> </tr> <tr> <td class="h" > <a name="492">492</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="493">493</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> @elements = qw(required parse parser type) if ! scalar (@elements); </td> </tr> <tr> <td class="h" > <a name="494">494</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> return $self->get_info ( </td> </tr> <tr> <td class="h" > <a name="495">495</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> "/xml-template/namespaces/namespace[\@name='$namespace']/element[\@name='$element']/attrib[\@name='$name']", </td> </tr> <tr> <td class="h" > <a name="496">496</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> @elements); </td> </tr> <tr> <td class="h" > <a name="497">497</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> } </td> </tr> <tr> <td class="h" > <a name="498">498</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="499">499</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =pod </td> </tr> <tr> <td class="h" > <a name="500">500</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="501">501</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 AUTHOR </td> </tr> <tr> <td class="h" > <a name="502">502</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="503">503</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Jonathan Waxman </td> </tr> <tr> <td class="h" > <a name="504">504</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> <jowaxman@bbl.med.upenn.edu> </td> </tr> <tr> <td class="h" > <a name="505">505</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="506">506</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =head1 COPYRIGHT </td> </tr> <tr> <td class="h" > <a name="507">507</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="508">508</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> Copyright (c) 2002-2003 Jonathan A. Waxman </td> </tr> <tr> <td class="h" > <a name="509">509</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> All rights reserved. </td> </tr> <tr> <td class="h" > <a name="510">510</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="511">511</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> This program is free software; you can redistribute it and/or </td> </tr> <tr> <td class="h" > <a name="512">512</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> modify it under the same terms as Perl itself. </td> </tr> <tr> <td class="h" > <a name="513">513</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="514">514</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> =cut </td> </tr> <tr> <td class="h" > <a name="515">515</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="516">516</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s">   </td> </tr> <tr> <td class="h" > <a name="517">517</a> </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td >   </td> <td class="s"> 1; </td> </tr> </table> </body> </html>