Add built local::lib
[catagits/Gitalist.git] / local-lib5 / man / man3 / Test::Differences.3pm
1 .\" Automatically generated by Pod::Man 2.22 (Pod::Simple 3.10)
2 .\"
3 .\" Standard preamble:
4 .\" ========================================================================
5 .de Sp \" Vertical space (when we can't use .PP)
6 .if t .sp .5v
7 .if n .sp
8 ..
9 .de Vb \" Begin verbatim text
10 .ft CW
11 .nf
12 .ne \\$1
13 ..
14 .de Ve \" End verbatim text
15 .ft R
16 .fi
17 ..
18 .\" Set up some character translations and predefined strings.  \*(-- will
19 .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
20 .\" double quote, and \*(R" will give a right double quote.  \*(C+ will
21 .\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
22 .\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
23 .\" nothing in troff, for use with C<>.
24 .tr \(*W-
25 .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
26 .ie n \{\
27 .    ds -- \(*W-
28 .    ds PI pi
29 .    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
30 .    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
31 .    ds L" ""
32 .    ds R" ""
33 .    ds C` ""
34 .    ds C' ""
35 'br\}
36 .el\{\
37 .    ds -- \|\(em\|
38 .    ds PI \(*p
39 .    ds L" ``
40 .    ds R" ''
41 'br\}
42 .\"
43 .\" Escape single quotes in literal strings from groff's Unicode transform.
44 .ie \n(.g .ds Aq \(aq
45 .el       .ds Aq '
46 .\"
47 .\" If the F register is turned on, we'll generate index entries on stderr for
48 .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
49 .\" entries marked with X<> in POD.  Of course, you'll have to process the
50 .\" output yourself in some meaningful fashion.
51 .ie \nF \{\
52 .    de IX
53 .    tm Index:\\$1\t\\n%\t"\\$2"
54 ..
55 .    nr % 0
56 .    rr F
57 .\}
58 .el \{\
59 .    de IX
60 ..
61 .\}
62 .\"
63 .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
64 .\" Fear.  Run.  Save yourself.  No user-serviceable parts.
65 .    \" fudge factors for nroff and troff
66 .if n \{\
67 .    ds #H 0
68 .    ds #V .8m
69 .    ds #F .3m
70 .    ds #[ \f1
71 .    ds #] \fP
72 .\}
73 .if t \{\
74 .    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
75 .    ds #V .6m
76 .    ds #F 0
77 .    ds #[ \&
78 .    ds #] \&
79 .\}
80 .    \" simple accents for nroff and troff
81 .if n \{\
82 .    ds ' \&
83 .    ds ` \&
84 .    ds ^ \&
85 .    ds , \&
86 .    ds ~ ~
87 .    ds /
88 .\}
89 .if t \{\
90 .    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
91 .    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
92 .    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
93 .    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
94 .    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
95 .    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
96 .\}
97 .    \" troff and (daisy-wheel) nroff accents
98 .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
99 .ds 8 \h'\*(#H'\(*b\h'-\*(#H'
100 .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
101 .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
102 .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
103 .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
104 .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
105 .ds ae a\h'-(\w'a'u*4/10)'e
106 .ds Ae A\h'-(\w'A'u*4/10)'E
107 .    \" corrections for vroff
108 .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
109 .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
110 .    \" for low resolution devices (crt and lpr)
111 .if \n(.H>23 .if \n(.V>19 \
112 \{\
113 .    ds : e
114 .    ds 8 ss
115 .    ds o a
116 .    ds d- d\h'-1'\(ga
117 .    ds D- D\h'-1'\(hy
118 .    ds th \o'bp'
119 .    ds Th \o'LP'
120 .    ds ae ae
121 .    ds Ae AE
122 .\}
123 .rm #[ #] #H #V #F C
124 .\" ========================================================================
125 .\"
126 .IX Title "Test::Differences 3"
127 .TH Test::Differences 3 "2009-10-17" "perl v5.8.7" "User Contributed Perl Documentation"
128 .\" For nroff, turn off justification.  Always turn off hyphenation; it makes
129 .\" way too many mistakes in technical documents.
130 .if n .ad l
131 .nh
132 .SH "NAME"
133 Test::Differences \- Test strings and data structures and show differences if not ok
134 .SH "SYNOPSIS"
135 .IX Header "SYNOPSIS"
136 .Vb 2
137 \&   use Test;    ## Or use Test::More
138 \&   use Test::Differences;
139 \&
140 \&   eq_or_diff $got,  "a\enb\enc\en",   "testing strings";
141 \&   eq_or_diff \e@got, [qw( a b c )], "testing arrays";
142 \&
143 \&   ## Passing options:
144 \&   eq_or_diff $got, $expected, $name, { context => 300 };  ## options
145 \&
146 \&   ## Using with DBI\-like data structures
147 \&
148 \&   use DBI;
149 \&
150 \&   ... open connection & prepare statement and @expected_... here...
151 \&   
152 \&   eq_or_diff $sth\->fetchall_arrayref, \e@expected_arrays  "testing DBI arrays";
153 \&   eq_or_diff $sth\->fetchall_hashref,  \e@expected_hashes, "testing DBI hashes";
154 \&
155 \&   ## To force textual or data line numbering (text lines are numbered 1..):
156 \&   eq_or_diff_text ...;
157 \&   eq_or_diff_data ...;
158 .Ve
159 .SH "EXPORT"
160 .IX Header "EXPORT"
161 This module exports three test functions and four diff-style functions:
162 .IP "\(bu" 4
163 Test functions
164 .RS 4
165 .IP "\(bu" 4
166 \&\f(CW\*(C`eq_or_diff\*(C'\fR
167 .IP "\(bu" 4
168 \&\f(CW\*(C`eq_or_diff_data\*(C'\fR
169 .IP "\(bu" 4
170 \&\f(CW\*(C`eq_or_diff_text\*(C'\fR
171 .RE
172 .RS 4
173 .RE
174 .IP "\(bu" 4
175 Diff style functions
176 .RS 4
177 .IP "\(bu" 4
178 \&\f(CW\*(C`table_diff\*(C'\fR (the default)
179 .IP "\(bu" 4
180 \&\f(CW\*(C`unified_diff\*(C'\fR
181 .IP "\(bu" 4
182 \&\f(CW\*(C`oldstyle_diff\*(C'\fR
183 .IP "\(bu" 4
184 \&\f(CW\*(C`context_diff\*(C'\fR
185 .RE
186 .RS 4
187 .RE
188 .SH "DESCRIPTION"
189 .IX Header "DESCRIPTION"
190 When the code you're testing returns multiple lines, records or data
191 structures and they're just plain wrong, an equivalent to the Unix
192 \&\f(CW\*(C`diff\*(C'\fR utility may be just what's needed.  Here's output from an
193 example test script that checks two text documents and then two
194 (trivial) data structures:
195 .PP
196 .Vb 10
197 \& t/99example....1..3
198 \& not ok 1 \- differences in text
199 \& #     Failed test ((eval 2) at line 14)
200 \& #     +\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
201 \& #     | Ln|Got             |Expected        |
202 \& #     +\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
203 \& #     |  1|this is line 1  |this is line 1  |
204 \& #     *  2|this is line 2  |this is line b  *
205 \& #     |  3|this is line 3  |this is line 3  |
206 \& #     +\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
207 \& not ok 2 \- differences in whitespace
208 \& #     Failed test ((eval 2) at line 20)
209 \& #     +\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
210 \& #     | Ln|Got               |Expected          |
211 \& #     +\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
212 \& #     |  1|        indented  |        indented  |
213 \& #     *  2|        indented  |\etindented        *
214 \& #     |  3|        indented  |        indented  |
215 \& #     +\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
216 \& not ok 3
217 \& #     Failed test ((eval 2) at line 22)
218 \& #     +\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
219 \& #     | Elt|Got                                  |Expected                    |
220 \& #     +\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
221 \& #     *   0|bless( [                             |[                           *
222 \& #     *   1|  \*(AqMove along, nothing to see here\*(Aq  |  \*(AqDry, humorless message\*(Aq  *
223 \& #     *   2|], \*(AqTest::Builder\*(Aq )                 |]                           *
224 \& #     +\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
225 \& # Looks like you failed 3 tests of 3.
226 .Ve
227 .PP
228 eq_or_diff_...() compares two strings or (limited) data structures and
229 either emits an ok indication or a side-by-side diff.  Test::Differences
230 is designed to be used with Test.pm and with Test::Simple, Test::More,
231 and other Test::Builder based testing modules.  As the \s-1SYNOPSIS\s0 shows,
232 another testing module must be used as the basis for your test suite.
233 .PP
234 These functions assume that you are presenting it with \*(L"flat\*(R" records,
235 looking like:
236 .PP
237 .Vb 4
238 \&   \- scalars composed of record\-per\-line
239 \&   \- arrays of scalars,
240 \&   \- arrays of arrays of scalars,
241 \&   \- arrays of hashes containing only scalars
242 .Ve
243 .PP
244 All of these are flattened in to single strings which are then compared
245 for differences.  Differently data structures can be compared, as long
246 as they flatten identically.
247 .PP
248 All other data structures are run through Data::Dumper first.  This is a
249 bit dangerous, as some versions of perl shipped with Data::Dumpers that
250 could do the oddest things with unexpected, like core dump.  Only as of
251 5.8.0 does Data::Dumper sort hash keys, which is necessary for \s-1HASH\s0
252 dumps to be fully predictable.  This will be changed when this bites
253 somebody or I get some free time.
254 .PP
255 \&\f(CW\*(C`eq_or_diff()\*(C'\fR starts counting records at 0 unless you pass it two text
256 strings:
257 .PP
258 .Vb 3
259 \&   eq_or_diff $a, $b;   ## First line is line number 1
260 \&   eq_or_diff @a, @b;   ## First element is element 0
261 \&   eq_or_diff $a, @b;   ## First line/element is element 0
262 .Ve
263 .PP
264 If you want to force a first record number of 0, use \f(CW\*(C`eq_or_diff_data\*(C'\fR.  If
265 you want to force a first record number of 1, use \f(CW\*(C`eq_or_diff_text\*(C'\fR.  I chose
266 this over passing in an options hash because it's clearer and simpler this way.
267 \&\s-1YMMV\s0.
268 .SH "OPTIONS"
269 .IX Header "OPTIONS"
270 There is currently only one option: \*(L"context\*(R".  This allows you to
271 control the amount of context shown:
272 .PP
273 .Vb 1
274 \&   eq_or_diff $got, $expected, $name, { context => 50000 };
275 .Ve
276 .PP
277 will show you lots and lots of context.  Normally, \fIeq_or_diff()\fR uses
278 some heuristics to determine whether to show 3 lines of context (like
279 a normal unified diff) or 25 lines.
280 .SH "DIFF STYLES"
281 .IX Header "DIFF STYLES"
282 For extremely long strings, a table diff can wrap on your screen and be hard
283 to read.  If you are comfortable with different diff formats, you can switch
284 to a format more suitable for your data.  These are the four formats supported
285 by the Text::Diff module and are set with the following functions:
286 .IP "\(bu" 4
287 \&\f(CW\*(C`table_diff\*(C'\fR (the default)
288 .IP "\(bu" 4
289 \&\f(CW\*(C`unified_diff\*(C'\fR
290 .IP "\(bu" 4
291 \&\f(CW\*(C`oldstyle_diff\*(C'\fR
292 .IP "\(bu" 4
293 \&\f(CW\*(C`context_diff\*(C'\fR
294 .PP
295 You can run the following to understand the different diff output styles:
296 .PP
297 .Vb 2
298 \& use Test::More \*(Aqno_plan\*(Aq;
299 \& use Test::Differences;
300 \& 
301 \& my $long_string = join \*(Aq\*(Aq => 1..40;
302 \& 
303 \& TODO: {
304 \&     local $TODO = \*(AqTesting diff styles\*(Aq;
305 \&
306 \&     # this is the default and does not need to explicitly set unless you need
307 \&     # to reset it back from another diff type
308 \&     table_diff;
309 \&     eq_or_diff $long_string, "\-$long_string", \*(Aqtable diff\*(Aq;
310 \&
311 \&     unified_diff;
312 \&     eq_or_diff $long_string, "\-$long_string", \*(Aqunified diff\*(Aq;
313 \&
314 \&     context_diff;
315 \&     eq_or_diff $long_string, "\-$long_string", \*(Aqcontext diff\*(Aq;
316 \&
317 \&     oldstyle_diff;
318 \&     eq_or_diff $long_string, "\-$long_string", \*(Aqoldstyle diff\*(Aq;
319 \& }
320 .Ve
321 .SH "DEPLOYING"
322 .IX Header "DEPLOYING"
323 There are several basic ways of deploying Test::Differences requiring more or less
324 labor by you or your users.
325 .IP "\(bu" 4
326 Fallback to \f(CW\*(C`is_deeply\*(C'\fR.
327 .Sp
328 This is your best option if you want this module to be optional.
329 .Sp
330 .Vb 6
331 \& use Test::More;
332 \& BEGIN {
333 \&     if (!eval q{ use Test::Differences; 1 }) {
334 \&         *eq_or_diff = \e&is_deeply;
335 \&     }
336 \& }
337 .Ve
338 .IP "\(bu" 4
339
340 .Sp
341 .Vb 1
342 \& eval "use Test::Differences";
343 .Ve
344 .Sp
345 If you want to detect the presence of Test::Differences on the fly, something
346 like the following code might do the trick for you:
347 .Sp
348 .Vb 1
349 \&    use Test qw( !ok );   ## get all syms *except* ok
350 \&
351 \&    eval "use Test::Differences";
352 \&    use Data::Dumper;
353 \&
354 \&    sub ok {
355 \&        goto &eq_or_diff if defined &eq_or_diff && @_ > 1;
356 \&        @_ = map ref $_ ? Dumper( @_ ) : $_, @_;
357 \&        goto Test::&ok;
358 \&    }
359 \&
360 \&    plan tests => 1;
361 \&
362 \&    ok "a", "b";
363 .Ve
364 .IP "\(bu" 4
365 \&\s-1PREREQ_PM\s0 => { .... \*(L"Test::Differences\*(R" => 0, ... }
366 .Sp
367 This method will let \s-1CPAN\s0 and \s-1CPANPLUS\s0 users download it automatically.  It
368 will discomfit those users who choose/have to download all packages manually.
369 .IP "\(bu" 4
370 t/lib/Test/Differences.pm, t/lib/Text/Diff.pm, ...
371 .Sp
372 By placing Test::Differences and its prerequisites in the t/lib directory, you
373 avoid forcing your users to download the Test::Differences manually if they
374 aren't using \s-1CPAN\s0 or \s-1CPANPLUS\s0.
375 .Sp
376 If you put a \f(CW\*(C`use lib "t/lib";\*(C'\fR in the top of each test suite before the
377 \&\f(CW\*(C`use Test::Differences;\*(C'\fR, \f(CW\*(C`make test\*(C'\fR should work well.
378 .Sp
379 You might want to check once in a while for new Test::Differences releases
380 if you do this.
381 .SH "LIMITATIONS"
382 .IX Header "LIMITATIONS"
383 .ie n .SS """Test"" or ""Test::More"""
384 .el .SS "\f(CWTest\fP or \f(CWTest::More\fP"
385 .IX Subsection "Test or Test::More"
386 This module \*(L"mixes in\*(R" with Test.pm or any of the test libraries based on
387 Test::Builder (Test::Simple, Test::More, etc).  It does this by peeking to see
388 whether Test.pm or Test/Builder.pm is in \f(CW%INC\fR, so if you are not using one of
389 those, it will print a warning and play dumb by not emitting test numbers (or
390 incrementing them).  If you are using one of these, it should interoperate
391 nicely.
392 .SS "Exporting"
393 .IX Subsection "Exporting"
394 Exports all 3 functions by default (and by design).  Use
395 .PP
396 .Vb 1
397 \&    use Test::Differences ();
398 .Ve
399 .PP
400 to suppress this behavior if you don't like the namespace pollution.
401 .PP
402 This module will not override functions like \fIok()\fR, \fIis()\fR, \fIis_deeply()\fR, etc.  If
403 it did, then you could \f(CW\*(C`eval "use Test::Differences qw( is_deeply );"\*(C'\fR to get
404 automatic upgrading to diffing behaviors without the \f(CW\*(C`sub my_ok\*(C'\fR shown above.
405 Test::Differences intentionally does not provide this behavior because this
406 would mean that Test::Differences would need to emulate every popular test
407 module out there, which would require far more coding and maintenance that I'm
408 willing to do.  Use the eval and my_ok deployment shown above if you want some
409 level of automation.
410 .SS "Unicode"
411 .IX Subsection "Unicode"
412 Perls before 5.6.0 don't support characters > 255 at all, and 5.6.0
413 seems broken.  This means that you might get odd results using perl5.6.0
414 with unicode strings.
415 .ie n .SS """Data::Dumper"" and older Perls."
416 .el .SS "\f(CWData::Dumper\fP and older Perls."
417 .IX Subsection "Data::Dumper and older Perls."
418 Relies on Data::Dumper (for now), which, prior to perl5.8, will not always
419 report hashes in the same order.  \f(CW $Data::Dumper::SortKeys \fR \fIis\fR set to 1,
420 so on more recent versions of Data::Dumper, this should not occur.  Check \s-1CPAN\s0
421 to see if it's been peeled out of the main perl distribution and backported.
422 Reported by Ilya Martynov <ilya@martynov.org>, although the SortKeys \*(L"future
423 perfect\*(R" workaround has been set in anticipation of a new Data::Dumper for a
424 while.  Note that the two hashes should report the same here:
425 .PP
426 .Vb 10
427 \&    not ok 5
428 \&    #     Failed test (t/ctrl/05\-home.t at line 51)
429 \&    # +\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+   
430 \&    # | Elt|Got                     | Elt|Expected                |   
431 \&    # +\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+   
432 \&    # |   0|{                       |   0|{                       |   
433 \&    # |   1|  \*(Aqpassword\*(Aq => \*(Aq\*(Aq,     |   1|  \*(Aqpassword\*(Aq => \*(Aq\*(Aq,     |   
434 \&    # *   2|  \*(Aqmethod\*(Aq => \*(Aqlogin\*(Aq,  *    |                        |   
435 \&    # |   3|  \*(Aqctrl\*(Aq => \*(Aqhome\*(Aq,     |   2|  \*(Aqctrl\*(Aq => \*(Aqhome\*(Aq,     |   
436 \&    # |    |                        *   3|  \*(Aqmethod\*(Aq => \*(Aqlogin\*(Aq,  *   
437 \&    # |   4|  \*(Aqemail\*(Aq => \*(Aqtest\*(Aq     |   4|  \*(Aqemail\*(Aq => \*(Aqtest\*(Aq     |   
438 \&    # |   5|}                       |   5|}                       |   
439 \&    # +\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+
440 .Ve
441 .PP
442 Data::Dumper also overlooks the difference between
443 .PP
444 .Vb 2
445 \&    $a[0] = \e$a[1];
446 \&    $a[1] = \e$a[0];   # $a[0] = \e$a[1]
447 .Ve
448 .PP
449 and
450 .PP
451 .Vb 3
452 \&    $x = \e$y;
453 \&    $y = \e$x;
454 \&    @a = ( $x, $y );  # $a[0] = \e$y, not \e$a[1]
455 .Ve
456 .PP
457 The former involves two scalars, the latter 4: \f(CW$x\fR, \f(CW$y\fR, and \f(CW@a\fR[0,1].
458 This was carefully explained to me in words of two syllables or less by
459 Yves Orton <demerphq@hotmail.com>.  The plan to address this is to allow
460 you to select Data::Denter or some other module of your choice as an
461 option.
462 .SH "AUTHOR"
463 .IX Header "AUTHOR"
464 .Vb 1
465 \&    Barrie Slaymaker <barries@slaysys.com>
466 .Ve
467 .SH "MAINTAINER"
468 .IX Header "MAINTAINER"
469 .Vb 1
470 \&    Curtis "Ovid" Poe <ovid@cpan.org>
471 .Ve
472 .SH "LICENSE"
473 .IX Header "LICENSE"
474 Copyright 2001\-2008 Barrie Slaymaker, All Rights Reserved.
475 .PP
476 You may use this software under the terms of the \s-1GNU\s0 public license, any
477 version, or the Artistic license.