File Coverage

blib/lib/Biblio/ILL/ISO/Shipped.pm
Criterion Covered Total %
statement 102 144 70.8
branch 30 90 33.3
condition 1 12 8.3
subroutine 19 22 86.3
pod 19 19 100.0
total 171 287 59.5


line stmt bran cond sub pod time code
1             package Biblio::ILL::ISO::Shipped;
2              
3             =head1 NAME
4              
5             Biblio::ILL::ISO::Shipped - Perl extension for handling ISO 10161 interlibrary loan Shipped messages
6              
7             =cut
8              
9 2     2   5979 use Biblio::ILL::ISO::ISO;
  2         5  
  2         67  
10 2     2   12 use Carp;
  2         5  
  2         236  
11              
12             =head1 VERSION
13              
14             Version 0.01
15              
16             =cut
17              
18             our $VERSION = '0.01';
19             #---------------------------------------------------------------------------
20             # Mods
21             # 0.01 - 2003.08.11 - original version
22             #---------------------------------------------------------------------------
23              
24             =head1 DESCRIPTION
25              
26             Biblio::ILL::ISO::Shipped is a derivation of the abstract
27             Biblio::ILL::ISO::ISO object, and handles the Shipped message type.
28              
29             =head1 EXPORT
30              
31             None.
32              
33             =head1 ERROR HANDLING
34              
35             Each of the set_() methods will croak on missing or invalid parameters.
36              
37             =cut
38              
39 2     2   4825 BEGIN{@ISA = qw ( Biblio::ILL::ISO::ISO ); }
40              
41             =head1 FROM THE ASN DEFINITION
42            
43             Shipped ::= [APPLICATION 3] SEQUENCE {
44             protocol-version-num [0] IMPLICIT INTEGER, -- {
45             -- version-1 (1),
46             -- version-2 (2)
47             -- },
48             transaction-id [1] IMPLICIT Transaction-Id,
49             service-date-time [2] IMPLICIT Service-Date-Time,
50             requester-id [3] IMPLICIT System-Id OPTIONAL,
51             -- mandatory when using store-and-forward communications
52             -- optional when using connection-oriented communications
53             responder-id [4] IMPLICIT System-Id OPTIONAL,
54             -- mandatory when using store-and-forward communications
55             -- optional when using connection-oriented communications
56             responder-address [24] IMPLICIT System-Address OPTIONAL,
57             intermediary-id [25] IMPLICIT System-Id OPTIONAL,
58             supplier-id [26] IMPLICIT System-Id OPTIONAL,
59             client-id [15] IMPLICIT Client-Id OPTIONAL,
60             transaction-type [5] IMPLICIT Transaction-Type, --DEFAULT 1,
61             -- DC - 'EXTERNAL' definition (see Supplemental-Item-Description)
62             -- supplemental-item-description [17] IMPLICIT Supplemental-Item-Description OPTIONAL,
63             shipped-service-type [27] IMPLICIT Shipped-Service-Type,
64             responder-optional-messages [28] IMPLICIT Responder-Optional-Messages-Type
65             OPTIONAL,
66             supply-details [29] IMPLICIT Supply-Details,
67             return-to-address [30] IMPLICIT Postal-Address OPTIONAL,
68             responder-note [46] ILL-String OPTIONAL,
69             shipped-extensions [49] IMPLICIT SEQUENCE OF Extension OPTIONAL
70             }
71            
72             =cut
73              
74             =head1 CONSTRUCTORS
75              
76             new()
77              
78             Base constructor for the class. It just returns a completely
79             empty message object, which you'll need to populate with the
80             various set_() methods, or use the read() method to read a
81             Shipped message from a file (followed by a call to
82             from_asn() to turn the read's returned hash into a proper
83             Shipped message.
84              
85             The constructor also initializes the Convert::ASN1 if it
86             hasn't been initialized.
87              
88             =cut
89             #---------------------------------------------------------------
90             #
91             #---------------------------------------------------------------
92             sub new {
93 2     2 1 21 my $class = shift;
94 2         5 my $self = {};
95              
96 2 50       5 Biblio::ILL::ISO::ISO::_init() if (not $Biblio::ILL::ISO::ISO::_asn_initialized);
97 2         6 $self->{"ASN_TYPE"} = "Shipped";
98              
99 2   33     11 bless($self, ref($class) || $class);
100 2         5 return ($self);
101             }
102              
103              
104             #---------------------------------------------------------------
105             #
106             #---------------------------------------------------------------
107             sub as_pretty_string {
108 0     0 1 0 my $self = shift;
109              
110 0         0 foreach my $key (sort keys %$self) {
111 0 0       0 if ($key ne "ASN_TYPE") {
112 0         0 print "\n[$key]\n";
113 0         0 print $self->{$key}->as_pretty_string();
114             }
115             }
116 0         0 return;
117             }
118              
119             #---------------------------------------------------------------
120             # This will return a structure usable by Convert::ASN1
121             #---------------------------------------------------------------
122             sub as_asn {
123 1     1 1 2 my $self = shift;
124              
125 1         3 my %h = ();
126 1         13 foreach my $key (sort keys %$self) {
127 15 100       32 if ($key ne "ASN_TYPE") {
128             #print "\n[$key]\n";
129 14         58 $h{$key} = $self->{$key}->as_asn();
130             }
131             }
132 1         4 return \%h;
133             }
134              
135             =head1 METHODS
136              
137             For any example code, assume the following:
138             my $msg = new Biblio::ILL::ISO::Shipped;
139              
140             =cut
141              
142             #---------------------------------------------------------------
143             #
144             #---------------------------------------------------------------
145             =head1
146              
147             =head2 from_asn($href)
148              
149             To read a message from a file, use the following:
150              
151             my $href = $msg->read("msg_03.shipped.ber");
152             $msg = $msg->from_asn($href);
153              
154             The from_asn() method turns the hash returned from read() into
155             a proper message-type object.
156              
157             =cut
158             sub from_asn {
159 0     0 1 0 my $self = shift;
160 0         0 my $href = shift;
161              
162 0         0 foreach my $k (keys %$href) {
163              
164 0 0 0     0 if ($k =~ /^protocol-version-num$/) {
    0 0        
    0 0        
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
165 0         0 $self->{$k} = new Biblio::ILL::ISO::ProtocolVersionNum();
166 0         0 $self->{$k}->from_asn($href->{$k});
167              
168             } elsif ($k =~ /^transaction-id$/) {
169 0         0 $self->{$k} = new Biblio::ILL::ISO::TransactionId();
170 0         0 $self->{$k}->from_asn($href->{$k});
171              
172             } elsif ($k =~ /^service-date-time$/) {
173 0         0 $self->{$k} = new Biblio::ILL::ISO::ServiceDateTime();
174 0         0 $self->{$k}->from_asn($href->{$k});
175              
176             } elsif (($k =~ /^requester-id$/)
177             || ($k =~ /^responder-id$/)
178             || ($k =~ /^intermediary-id$/)
179             || ($k =~ /^supplier-id$/)
180             ) {
181 0         0 $self->{$k} = new Biblio::ILL::ISO::SystemId();
182 0         0 $self->{$k}->from_asn($href->{$k});
183              
184             } elsif ($k =~ /^responder-address$/) {
185 0         0 $self->{$k} = new Biblio::ILL::ISO::SystemAddress();
186 0         0 $self->{$k}->from_asn($href->{$k});
187              
188             } elsif ($k =~ /^client-id$/) {
189 0         0 $self->{$k} = new Biblio::ILL::ISO::ClientId();
190 0         0 $self->{$k}->from_asn($href->{$k});
191              
192             } elsif ($k =~ /^transaction-type$/) {
193 0         0 $self->{$k} = new Biblio::ILL::ISO::TransactionType();
194 0         0 $self->{$k}->from_asn($href->{$k});
195              
196             } elsif ($k =~ /^shipped-service-type$/) {
197 0         0 $self->{$k} = new Biblio::ILL::ISO::ShippedServiceType();
198 0         0 $self->{$k}->from_asn($href->{$k});
199              
200             } elsif ($k =~ /^responder-optional-messages$/) {
201 0         0 $self->{$k} = new Biblio::ILL::ISO::ResponderOptionMessageType();
202 0         0 $self->{$k}->from_asn($href->{$k});
203              
204             } elsif ($k =~ /^supply-details$/) {
205 0         0 $self->{$k} = new Biblio::ILL::ISO::SupplyDetails();
206 0         0 $self->{$k}->from_asn($href->{$k});
207              
208             } elsif ($k =~ /^return-to-address$/) {
209 0         0 $self->{$k} = new Biblio::ILL::ISO::PostalAddress();
210 0         0 $self->{$k}->from_asn($href->{$k});
211              
212             } elsif ($k =~ /^responder-note$/) {
213 0         0 $self->{$k} = new Biblio::ILL::ISO::ILLString();
214 0         0 $self->{$k}->from_asn($href->{$k});
215              
216             } elsif ($k =~ /^shipped-extensions$/) {
217             #$self->{$k} = new Biblio::ILL::ISO::Extension();
218             #$self->{$k}->from_asn($href->{$k});
219              
220             } else {
221 0         0 croak "invalid " . ref($self) . " element: [$k]";
222             }
223              
224             }
225 0         0 return $self;
226             }
227              
228             #---------------------------------------------------------------
229             #
230             #---------------------------------------------------------------
231             =head1
232              
233             =head2 set_protocol_version_num($pvn)
234              
235             Sets the protocol version number.
236             Acceptable parameter values are the strings:
237             version-1
238             version-2
239              
240             =cut
241             sub set_protocol_version_num {
242 1     1 1 6 my $self = shift;
243 1         8 my ($parm) = shift;
244              
245 1 50       4 croak "missing protocol-version-num" unless $parm;
246              
247 1         5 $self->{"protocol-version-num"} = new Biblio::ILL::ISO::ProtocolVersionNum($parm);
248              
249 1         3 return;
250             }
251              
252             #---------------------------------------------------------------
253             #
254             #---------------------------------------------------------------
255             =head1
256              
257             =head2 set_transaction_id($tid)
258              
259             Sets the message's transaction-id.
260             Expects a valid Biblio::ILL::ISO::TransactionId.
261              
262             my $tid = new Biblio::ILL::ISO::TransactionId("PLS","001","",
263             new Biblio::ILL::ISO::SystemId("MWPL"));
264             $msg->set_transaction_id($tid);
265              
266             This is a mandatory field.
267              
268             =cut
269             sub set_transaction_id {
270 1     1 1 5 my $self = shift;
271 1         2 my ($parm) = shift;
272              
273 1 50       3 croak "missing transaction-id" unless $parm;
274 1 50       5 croak "invalid transaction-id" unless (ref($parm) eq "Biblio::ILL::ISO::TransactionId");
275              
276 1         2 $self->{"transaction-id"} = $parm;
277              
278 1         2 return;
279             }
280              
281             #---------------------------------------------------------------
282             #
283             #---------------------------------------------------------------
284             =head1
285              
286             =head2 set_service_date_time($sdt)
287              
288             Sets the message's service-date-time.
289             Expects a valid Biblio::ILL::ISO::ServiceDateTime.
290              
291             my $dt_this = new Biblio::ILL::ISO::DateTime("20030623","114400");
292             my $dt_orig = new Biblio::ILL::ISO::DateTime("20030623","114015")
293             my $sdt = new Biblio::ILL::ISO::ServiceDateTime( $dt_this, $dt_orig);
294             $msg->set_service_date_time($sdt);
295              
296             This is a mandatory field.
297              
298             =cut
299             sub set_service_date_time {
300 1     1 1 5 my $self = shift;
301 1         3 my ($sdt) = shift;
302              
303 1 50       3 croak "missing service-date-time" unless $sdt;
304 1 50       4 croak "invalid service-date-time" unless (ref($sdt) eq "Biblio::ILL::ISO::ServiceDateTime");
305              
306 1         9 $self->{"service-date-time"} = $sdt;
307              
308 1         2 return;
309             }
310              
311             #---------------------------------------------------------------
312             #
313             #---------------------------------------------------------------
314             =head1
315              
316             =head2 set_requester_id($reqid)
317              
318             Sets the message's requester-id.
319             Expects a valid Biblio::ILL::ISO::SystemId.
320              
321             my $reqid = new Biblio::ILL::ISO::SystemId();
322             $reqid->set_person_name("David A. Christensen");
323             $msg->set_requester_id($reqid);
324              
325             This is an optional field.
326              
327             =cut
328             sub set_requester_id {
329 1     1 1 11 my $self = shift;
330 1         2 my ($parm) = shift;
331              
332 1 50       4 croak "missing requester-id" unless $parm;
333 1 50       4 croak "invalid requester-id" unless (ref($parm) eq "Biblio::ILL::ISO::SystemId");
334              
335 1         3 $self->{"requester-id"} = $parm;
336              
337 1         3 return;
338             }
339              
340             #---------------------------------------------------------------
341             #
342             #---------------------------------------------------------------
343             =head1
344              
345             =head2 set_responder_id($resid)
346              
347             Sets the message's responder-id.
348             Expects a valid Biblio::ILL::ISO::SystemId.
349              
350             my $resid = new Biblio::ILL::ISO::SystemId("MWPL");
351             $msg->set_responder_id($resid);
352              
353             This is an optional field.
354              
355             =cut
356             sub set_responder_id {
357 1     1 1 5 my $self = shift;
358 1         2 my ($parm) = shift;
359              
360 1 50       3 croak "missing responder-id" unless $parm;
361 1 50       3 croak "invalid responder-id" unless (ref($parm) eq "Biblio::ILL::ISO::SystemId");
362              
363 1         2 $self->{"responder-id"} = $parm;
364              
365 1         2 return;
366             }
367              
368             #---------------------------------------------------------------
369             #
370             #---------------------------------------------------------------
371             =head1
372              
373             =head2 set_responder_address($rad)
374              
375             Sets the message's responder-address.
376             Expects a valid Biblio::ILL::ISO::SystemAddress.
377              
378             my $rad = new Biblio::ILL::ISO::SystemAddress("SMTP","pls\@gov.mb.ca");
379             $msg->set_responder_address($rad);
380              
381             This is an optional field.
382              
383             =cut
384             sub set_responder_address {
385 1     1 1 5 my $self = shift;
386 1         2 my ($parm) = shift;
387              
388 1 50       3 croak "missing responder-address" unless $parm;
389 1 50       9 croak "invalid responder-address" unless (ref($parm) eq "Biblio::ILL::ISO::SystemAddress");
390              
391 1         1 $self->{"responder-address"} = $parm;
392              
393 1         2 return;
394             }
395              
396             #---------------------------------------------------------------
397             #
398             #---------------------------------------------------------------
399             =head1
400              
401             =head2 set_intermediary_id($iid)
402              
403             Sets the message's intermediary-id.
404             Expects a valid Biblio::ILL::ISO::SystemAddress.
405              
406             my $iid = new Biblio::ILL::ISO::SystemId();
407             $iid->set_institution_name("The Great Library of Alexandria");
408             $msg->set_intermediary_id($iid);
409              
410             This is an optional field.
411              
412             =cut
413             sub set_intermediary_id {
414 1     1 1 4 my $self = shift;
415 1         3 my ($parm) = shift;
416              
417 1 50       2 croak "missing intermediary-id" unless $parm;
418 1 50       4 croak "invalid intermediary-id" unless (ref($parm) eq "Biblio::ILL::ISO::SystemId");
419              
420 1         2 $self->{"intermediary-id"} = $parm;
421              
422 1         2 return;
423             }
424              
425             #---------------------------------------------------------------
426             #
427             #---------------------------------------------------------------
428             =head1
429              
430             =head2 set_supplier_id($sid)
431              
432             Sets the message's supplier-id.
433             Expects a valid Biblio::ILL::ISO::SystemId.
434              
435             my $sid = new Biblio::ILL::ISO::SystemId("MWPL");
436             $msg->set_supplier_id($sid);
437              
438             This is an optional field.
439              
440             =cut
441             sub set_supplier_id {
442 1     1 1 6 my $self = shift;
443 1         2 my ($parm) = shift;
444              
445 1 50       3 croak "missing supplier-id" unless $parm;
446 1 50       4 croak "invalid supplier-id" unless (ref($parm) eq "Biblio::ILL::ISO::SystemId");
447              
448 1         3 $self->{"supplier-id"} = $parm;
449              
450 1         2 return;
451             }
452              
453             #---------------------------------------------------------------
454             #
455             #---------------------------------------------------------------
456             =head1
457              
458             =head2 set_client_id($cid)
459              
460             Sets the message's client-id.
461             Expects a valid Biblio::ILL::ISO::ClientId.
462              
463             my $cid = new Biblio::ILL::ISO::ClientId("David Christensen",
464             "Most excellent",
465             "007"
466             );
467             $msg->set_client_id($cid)
468              
469             This is an optional field.
470              
471             =cut
472             sub set_client_id {
473 1     1 1 4 my $self = shift;
474 1         2 my ($parm) = shift;
475              
476 1 50       3 croak "missing client-id" unless $parm;
477 1 50       4 croak "invalid client-id" unless (ref($parm) eq "Biblio::ILL::ISO::ClientId");
478              
479 1         2 $self->{"client-id"} = $parm;
480              
481 1         2 return;
482             }
483              
484             #---------------------------------------------------------------
485             #
486             #---------------------------------------------------------------
487             =head1
488              
489             =head2 set_transaction_type($tt)
490              
491             Sets the message's transaction-type.
492             Expects a valid Biblio::ILL::ISO::TransactionType.
493              
494             my $tt = new Biblio::ILL::ISO::TransactionType("simple");
495             $msg->set_transaction_type($tt);
496              
497             This is a mandatory field.
498              
499             =cut
500             sub set_transaction_type {
501 1     1 1 6 my $self = shift;
502 1         3 my ($parm) = shift;
503              
504 1 50       3 croak "missing transaction-type" unless $parm;
505 1 50       4 croak "invalid transaction-type" unless (ref($parm) eq "Biblio::ILL::ISO::TransactionType");
506              
507 1         2 $self->{"transaction-type"} = $parm;
508              
509 1         2 return;
510             }
511              
512             #---------------------------------------------------------------
513             #
514             #---------------------------------------------------------------
515             =head1
516              
517             =head2 set_shipped_service_type($sst)
518              
519             Sets the message's shipped-service-type.
520             Expects a valid Biblio::ILL::ISO::ShippedServiceType.
521              
522             my $sst = new Biblio::ILL::ISO::ShippedServiceType("loan");
523             $msg->set_shipped_service_type($sst);
524              
525             This is a mandatory field.
526              
527             =cut
528             sub set_shipped_service_type {
529 1     1 1 5 my $self = shift;
530 1         1 my ($parm) = shift;
531              
532 1 50       17 croak "missing shipped-service-type" unless $parm;
533 1 50       4 croak "invalid shipped-service-type" unless (ref($parm) eq "Biblio::ILL::ISO::ShippedServiceType");
534              
535 1         2 $self->{"shipped-service-type"} = $parm;
536              
537 1         3 return;
538             }
539              
540             #---------------------------------------------------------------
541             #
542             #---------------------------------------------------------------
543             =head1
544              
545             =head2 set_responder_optional_messages($rom)
546              
547             Sets the message's responder-optional-messages.
548             Expects a valid Biblio::ILL::ISO::ResponderOptionalMessageType.
549              
550             my $rom = new Biblio::ILL::ISO::ResponderOptionalMessageType(1,1,
551             "desires",
552             "requires"
553             );
554             $msg->set_responder_optional_messages($rom);
555              
556             This is an optional field.
557              
558             =cut
559             sub set_responder_optional_messages {
560 0     0 1 0 my $self = shift;
561 0         0 my ($parm) = shift;
562              
563 0 0       0 croak "missing responder-optional-messages" unless $parm;
564 0 0       0 croak "invalid responder-optional-messages" unless (ref($parm) eq "Biblio::ILL::ISO::ResponderOptionalMessageType");
565              
566 0         0 $self->{"responder-optional-messages"} = $parm;
567              
568 0         0 return;
569             }
570              
571             #---------------------------------------------------------------
572             #
573             #---------------------------------------------------------------
574             =head1
575              
576             =head2 set_supply_details($sd)
577              
578             Sets the message's supply-details.
579             Expects a valid Biblio::ILL::ISO::SupplyDetails.
580              
581             my $smt = new Biblio::ILL::ISO::SupplyMediumType("audio-recording");
582             my $upmt = new Biblio::ILL::ISO::UnitsPerMediumType( $smt, 3);
583             my $upmts = new Biblio::ILL::ISO::UnitsPerMediumTypeSequence( $upmt );
584             my $sc = new Biblio::ILL::ISO::ShippedConditions("no-reproduction");
585             my $tm = new Biblio::ILL::ISO::TransportationMode("Canada Post");
586             my $sv = new Biblio::ILL::ISO::ShippedVia( $tm );
587             my $sd = new Biblio::ILL::ISO::SupplyDetails("20030813",
588             "20030920",
589             123,
590             "45.67",
591             $sc,
592             $sv,
593             new Biblio::ILL::ISO::Amount("50.00"),
594             "50.00",
595             $upmts
596             );
597             $msg->set_supply_details($sd);
598              
599             This is a mandatory field.
600              
601             =cut
602             sub set_supply_details {
603 1     1 1 4 my $self = shift;
604 1         2 my ($parm) = shift;
605              
606 1 50       9 croak "missing supply-details" unless $parm;
607 1 50       4 croak "invalid supply-details" unless (ref($parm) eq "Biblio::ILL::ISO::SupplyDetails");
608              
609 1         2 $self->{"supply-details"} = $parm;
610              
611 1         3 return;
612             }
613              
614             #---------------------------------------------------------------
615             #
616             #---------------------------------------------------------------
617             =head1
618              
619             =head2 set_return_to_address($rta)
620              
621             Sets the message's return-to-address.
622             Expects a valid Biblio::ILL::ISO::PostalAddress.
623              
624             my $rta = new Biblio::ILL::ISO::PostalAddress("Manitoba Public Library Services",
625             "",
626             "Unit 200",
627             "1525 First Street South",
628             "",
629             "Brandon",
630             "MB",
631             "CANADA",
632             "R7A 7A1"
633             );
634             $msg->set_return_to_address($rta);
635              
636             This is an optional field.
637              
638             =cut
639             sub set_return_to_address {
640 1     1 1 4 my $self = shift;
641 1         2 my ($parm) = shift;
642              
643 1 50       8 croak "missing return-to-address" unless $parm;
644 1 50       9 croak "invalid return-to-address" unless (ref($parm) eq "Biblio::ILL::ISO::PostalAddress");
645              
646 1         3 $self->{"return-to-address"} = $parm;
647              
648 1         7 return;
649             }
650              
651             #---------------------------------------------------------------
652             #
653             #---------------------------------------------------------------
654             =head1
655              
656             =head2 set_responder_note($note)
657              
658             Sets the message's responder-note.
659             Expects a simple text string.
660              
661             $msg->set_responder_note("This is a responder note");
662              
663             This is an optional field.
664              
665             =cut
666             sub set_responder_note {
667 1     1 1 4 my $self = shift;
668 1         2 my ($parm) = shift;
669              
670 1 50       9 croak "missing responder-note" unless $parm;
671 1 50       3 croak "invalid responder-note" unless (ref($parm) eq "Biblio::ILL::ISO::ILLString");
672              
673 1         2 $self->{"responder-note"} = $parm;
674              
675 1         3 return;
676             }
677              
678             =head1 RELATED MODULES
679              
680             Biblio::ILL::ISO::ISO
681             Biblio::ILL::ISO::Request
682             Biblio::ILL::ISO::ForwardNotification
683             Biblio::ILL::ISO::Shipped
684             Biblio::ILL::ISO::Answer
685             Biblio::ILL::ISO::ConditionalReply
686             Biblio::ILL::ISO::Cancel
687             Biblio::ILL::ISO::CancelReply
688             Biblio::ILL::ISO::Received
689             Biblio::ILL::ISO::Recall
690             Biblio::ILL::ISO::Returned
691             Biblio::ILL::ISO::CheckedIn
692             Biblio::ILL::ISO::Overdue
693             Biblio::ILL::ISO::Renew
694             Biblio::ILL::ISO::RenewAnswer
695             Biblio::ILL::ISO::Lost
696             Biblio::ILL::ISO::Damaged
697             Biblio::ILL::ISO::Message
698             Biblio::ILL::ISO::StatusQuery
699             Biblio::ILL::ISO::StatusOrErrorReport
700             Biblio::ILL::ISO::Expired
701              
702             =cut
703              
704             =head1 SEE ALSO
705              
706             See the README for system design notes.
707              
708             For more information on Interlibrary Loan standards (ISO 10160/10161),
709             a good place to start is:
710              
711             http://www.nlc-bnc.ca/iso/ill/main.htm
712              
713             =cut
714              
715             =head1 AUTHOR
716              
717             David Christensen,
718              
719             =cut
720              
721              
722             =head1 COPYRIGHT AND LICENSE
723              
724             Copyright 2003 by David Christensen
725              
726             This library is free software; you can redistribute it and/or modify it
727             under the same terms as Perl itself.
728              
729             =cut
730              
731             1;