summaryrefslogtreecommitdiffstats
path: root/upstream/mageia-cauldron/man3pm/version::Internals.3pm
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/mageia-cauldron/man3pm/version::Internals.3pm')
-rw-r--r--upstream/mageia-cauldron/man3pm/version::Internals.3pm760
1 files changed, 760 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man3pm/version::Internals.3pm b/upstream/mageia-cauldron/man3pm/version::Internals.3pm
new file mode 100644
index 00000000..5e0c8232
--- /dev/null
+++ b/upstream/mageia-cauldron/man3pm/version::Internals.3pm
@@ -0,0 +1,760 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is >0, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{\
+. if \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{\
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\" ========================================================================
+.\"
+.IX Title "version::Internals 3pm"
+.TH version::Internals 3pm 2023-11-28 "perl v5.38.2" "Perl Programmers Reference Guide"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH NAME
+version::Internals \- Perl extension for Version Objects
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+Overloaded version objects for all modern versions of Perl. This documents
+the internal data representation and underlying code for version.pm. See
+\&\fIversion.pod\fR for daily usage. This document is only useful for users
+interested in the gory details.
+.SH "WHAT IS A VERSION?"
+.IX Header "WHAT IS A VERSION?"
+For the purposes of this module, a version "number" is a sequence of
+positive integer values separated by one or more decimal points and
+optionally a single underscore. This corresponds to what Perl itself
+uses for a version, as well as extending the "version as number" that
+is discussed in the various editions of the Camel book.
+.PP
+There are actually two distinct kinds of version objects:
+.IP "Decimal versions" 4
+.IX Item "Decimal versions"
+Any version which "looks like a number", see "Decimal Versions". This
+also includes versions with a single decimal point and a single embedded
+underscore, see "Alpha Versions", even though these must be quoted
+to preserve the underscore formatting.
+.IP "Dotted-Decimal versions" 4
+.IX Item "Dotted-Decimal versions"
+Also referred to as "Dotted-Integer", these contains more than one decimal
+point and may have an optional embedded underscore, see Dotted-Decimal
+Versions. This is what is commonly used in most open source software as
+the "external" version (the one used as part of the tag or tarfile name).
+A leading 'v' character is now required and will warn if it missing.
+.PP
+Both of these methods will produce similar version objects, in that
+the default stringification will yield the version "Normal Form" only
+if required:
+.PP
+.Vb 3
+\& $v = version\->new(1.002); # 1.002, but compares like 1.2.0
+\& $v = version\->new(1.002003); # 1.002003
+\& $v2 = version\->new("v1.2.3"); # v1.2.3
+.Ve
+.PP
+In specific, version numbers initialized as "Decimal Versions" will
+stringify as they were originally created (i.e. the same string that was
+passed to \f(CWnew()\fR. Version numbers initialized as "Dotted-Decimal Versions"
+will be stringified as "Normal Form".
+.SS "Decimal Versions"
+.IX Subsection "Decimal Versions"
+These correspond to historical versions of Perl itself prior to 5.6.0,
+as well as all other modules which follow the Camel rules for the
+\&\f(CW$VERSION\fR scalar. A Decimal version is initialized with what looks like
+a floating point number. Leading zeros \fBare\fR significant and trailing
+zeros are implied so that a minimum of three places is maintained
+between subversions. What this means is that any subversion (digits
+to the right of the decimal place) that contains less than three digits
+will have trailing zeros added to make up the difference, but only for
+purposes of comparison with other version objects. For example:
+.PP
+.Vb 7
+\& # Prints Equivalent to
+\& $v = version\->new( 1.2); # 1.2 v1.200.0
+\& $v = version\->new( 1.02); # 1.02 v1.20.0
+\& $v = version\->new( 1.002); # 1.002 v1.2.0
+\& $v = version\->new( 1.0023); # 1.0023 v1.2.300
+\& $v = version\->new( 1.00203); # 1.00203 v1.2.30
+\& $v = version\->new( 1.002003); # 1.002003 v1.2.3
+.Ve
+.PP
+All of the preceding examples are true whether or not the input value is
+quoted. The important feature is that the input value contains only a
+single decimal. See also "Alpha Versions".
+.PP
+IMPORTANT NOTE: As shown above, if your Decimal version contains more
+than 3 significant digits after the decimal place, it will be split on
+each multiple of 3, so 1.0003 is equivalent to v1.0.300, due to the need
+to remain compatible with Perl's own 5.005_03 == 5.5.30 interpretation.
+Any trailing zeros are ignored for mathematical comparison purposes.
+.SS "Dotted-Decimal Versions"
+.IX Subsection "Dotted-Decimal Versions"
+These are the newest form of versions, and correspond to Perl's own
+version style beginning with 5.6.0. Starting with Perl 5.10.0,
+and most likely Perl 6, this is likely to be the preferred form. This
+method normally requires that the input parameter be quoted, although
+Perl's after 5.8.1 can use v\-strings as a special form of quoting, but
+this is highly discouraged.
+.PP
+Unlike "Decimal Versions", Dotted-Decimal Versions have more than
+a single decimal point, e.g.:
+.PP
+.Vb 6
+\& # Prints
+\& $v = version\->new( "v1.200"); # v1.200.0
+\& $v = version\->new("v1.20.0"); # v1.20.0
+\& $v = qv("v1.2.3"); # v1.2.3
+\& $v = qv("1.2.3"); # v1.2.3
+\& $v = qv("1.20"); # v1.20.0
+.Ve
+.PP
+In general, Dotted-Decimal Versions permit the greatest amount of freedom
+to specify a version, whereas Decimal Versions enforce a certain
+uniformity.
+.PP
+Just like "Decimal Versions", Dotted-Decimal Versions can be used as
+"Alpha Versions".
+.SS "Alpha Versions"
+.IX Subsection "Alpha Versions"
+For module authors using CPAN, the convention has been to note unstable
+releases with an underscore in the version string. (See CPAN.) version.pm
+follows this convention and alpha releases will test as being newer than the
+more recent stable release, and less than the next stable release. Only the
+last element may be separated by an underscore:
+.PP
+.Vb 2
+\& # Declaring
+\& use version 0.77; our $VERSION = version\->declare("v1.2_3");
+\&
+\& # Parsing
+\& $v1 = version\->parse("v1.2_3");
+\& $v1 = version\->parse("1.002_003");
+.Ve
+.PP
+Note that you \fBmust\fR quote the version when writing an alpha Decimal version.
+The stringified form of Decimal versions will always be the same string that
+was used to initialize the version object.
+.SS "Regular Expressions for Version Parsing"
+.IX Subsection "Regular Expressions for Version Parsing"
+A formalized definition of the legal forms for version strings is
+included in the \f(CW\*(C`version::regex\*(C'\fR class. Primitives are included for
+common elements, although they are scoped to the file so they are useful
+for reference purposes only. There are two publicly accessible scalars
+that can be used in other code (not exported):
+.ie n .IP $version::LAX 4
+.el .IP \f(CW$version::LAX\fR 4
+.IX Item "$version::LAX"
+This regexp covers all of the legal forms allowed under the current
+version string parser. This is not to say that all of these forms
+are recommended, and some of them can only be used when quoted.
+.Sp
+For dotted decimals:
+.Sp
+.Vb 3
+\& v1.2
+\& 1.2345.6
+\& v1.23_4
+.Ve
+.Sp
+The leading 'v' is optional if two or more decimals appear. If only
+a single decimal is included, then the leading 'v' is required to
+trigger the dotted-decimal parsing. A leading zero is permitted,
+though not recommended except when quoted, because of the risk that
+Perl will treat the number as octal. A trailing underscore plus one
+or more digits denotes an alpha or development release (and must be
+quoted to be parsed properly).
+.Sp
+For decimal versions:
+.Sp
+.Vb 3
+\& 1
+\& 1.2345
+\& 1.2345_01
+.Ve
+.Sp
+an integer portion, an optional decimal point, and optionally one or
+more digits to the right of the decimal are all required. A trailing
+underscore is permitted and a leading zero is permitted. Just like
+the lax dotted-decimal version, quoting the values is required for
+alpha/development forms to be parsed correctly.
+.ie n .IP $version::STRICT 4
+.el .IP \f(CW$version::STRICT\fR 4
+.IX Item "$version::STRICT"
+This regexp covers a much more limited set of formats and constitutes
+the best practices for initializing version objects. Whether you choose
+to employ decimal or dotted-decimal for is a personal preference however.
+.RS 4
+.IP v1.234.5 4
+.IX Item "v1.234.5"
+For dotted-decimal versions, a leading 'v' is required, with three or
+more sub-versions of no more than three digits. A leading 0 (zero)
+before the first sub-version (in the above example, '1') is also
+prohibited.
+.IP 2.3456 4
+.IX Item "2.3456"
+For decimal versions, an integer portion (no leading 0), a decimal point,
+and one or more digits to the right of the decimal are all required.
+.RE
+.RS 4
+.RE
+.PP
+Both of the provided scalars are already compiled as regular expressions
+and do not contain either anchors or implicit groupings, so they can be
+included in your own regular expressions freely. For example, consider
+the following code:
+.PP
+.Vb 6
+\& ($pkg, $ver) =~ /
+\& ^[ \et]*
+\& use [ \et]+($PKGNAME)
+\& (?:[ \et]+($version::STRICT))?
+\& [ \et]*;
+\& /x;
+.Ve
+.PP
+This would match a line of the form:
+.PP
+.Vb 1
+\& use Foo::Bar::Baz v1.2.3; # legal only in Perl 5.8.1+
+.Ve
+.PP
+where \f(CW$PKGNAME\fR is another regular expression that defines the legal
+forms for package names.
+.SH "IMPLEMENTATION DETAILS"
+.IX Header "IMPLEMENTATION DETAILS"
+.SS "Equivalence between Decimal and Dotted-Decimal Versions"
+.IX Subsection "Equivalence between Decimal and Dotted-Decimal Versions"
+When Perl 5.6.0 was released, the decision was made to provide a
+transformation between the old-style decimal versions and new-style
+dotted-decimal versions:
+.PP
+.Vb 2
+\& 5.6.0 == 5.006000
+\& 5.005_04 == 5.5.40
+.Ve
+.PP
+The floating point number is taken and split first on the single decimal
+place, then each group of three digits to the right of the decimal makes up
+the next digit, and so on until the number of significant digits is exhausted,
+\&\fBplus\fR enough trailing zeros to reach the next multiple of three.
+.PP
+This was the method that version.pm adopted as well. Some examples may be
+helpful:
+.PP
+.Vb 9
+\& equivalent
+\& decimal zero\-padded dotted\-decimal
+\& \-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-
+\& 1.2 1.200 v1.200.0
+\& 1.02 1.020 v1.20.0
+\& 1.002 1.002 v1.2.0
+\& 1.0023 1.002300 v1.2.300
+\& 1.00203 1.002030 v1.2.30
+\& 1.002003 1.002003 v1.2.3
+.Ve
+.SS "Quoting Rules"
+.IX Subsection "Quoting Rules"
+Because of the nature of the Perl parsing and tokenizing routines,
+certain initialization values \fBmust\fR be quoted in order to correctly
+parse as the intended version, especially when using the \f(CW\*(C`declare\*(C'\fR or
+"\fBqv()\fR" methods. While you do not have to quote decimal numbers when
+creating version objects, it is always safe to quote \fBall\fR initial values
+when using version.pm methods, as this will ensure that what you type is
+what is used.
+.PP
+Additionally, if you quote your initializer, then the quoted value that goes
+\&\fBin\fR will be exactly what comes \fBout\fR when your \f(CW$VERSION\fR is printed
+(stringified). If you do not quote your value, Perl's normal numeric handling
+comes into play and you may not get back what you were expecting.
+.PP
+If you use a mathematic formula that resolves to a floating point number,
+you are dependent on Perl's conversion routines to yield the version you
+expect. You are pretty safe by dividing by a power of 10, for example,
+but other operations are not likely to be what you intend. For example:
+.PP
+.Vb 4
+\& $VERSION = version\->new((qw$Revision: 1.4)[1]/10);
+\& print $VERSION; # yields 0.14
+\& $V2 = version\->new(100/9); # Integer overflow in decimal number
+\& print $V2; # yields something like 11.111.111.100
+.Ve
+.PP
+Perl 5.8.1 and beyond are able to automatically quote v\-strings but
+that is not possible in earlier versions of Perl. In other words:
+.PP
+.Vb 2
+\& $version = version\->new("v2.5.4"); # legal in all versions of Perl
+\& $newvers = version\->new(v2.5.4); # legal only in Perl >= 5.8.1
+.Ve
+.SS "What about v\-strings?"
+.IX Subsection "What about v-strings?"
+There are two ways to enter v\-strings: a bare number with two or more
+decimal points, or a bare number with one or more decimal points and a
+leading 'v' character (also bare). For example:
+.PP
+.Vb 2
+\& $vs1 = 1.2.3; # encoded as \e1\e2\e3
+\& $vs2 = v1.2; # encoded as \e1\e2
+.Ve
+.PP
+However, the use of bare v\-strings to initialize version objects is
+\&\fBstrongly\fR discouraged in all circumstances. Also, bare
+v\-strings are not completely supported in any version of Perl prior to
+5.8.1.
+.PP
+If you insist on using bare v\-strings with Perl > 5.6.0, be aware of the
+following limitations:
+.PP
+1) For Perl releases 5.6.0 through 5.8.0, the v\-string code merely guesses,
+based on some characteristics of v\-strings. You \fBmust\fR use a three part
+version, e.g. 1.2.3 or v1.2.3 in order for this heuristic to be successful.
+.PP
+2) For Perl releases 5.8.1 and later, v\-strings have changed in the Perl
+core to be magical, which means that the version.pm code can automatically
+determine whether the v\-string encoding was used.
+.PP
+3) In all cases, a version created using v\-strings will have a stringified
+form that has a leading 'v' character, for the simple reason that sometimes
+it is impossible to tell whether one was present initially.
+.SS "Version Object Internals"
+.IX Subsection "Version Object Internals"
+version.pm provides an overloaded version object that is designed to both
+encapsulate the author's intended \f(CW$VERSION\fR assignment as well as make it
+completely natural to use those objects as if they were numbers (e.g. for
+comparisons). To do this, a version object contains both the original
+representation as typed by the author, as well as a parsed representation
+to ease comparisons. Version objects employ overload methods to
+simplify code that needs to compare, print, etc the objects.
+.PP
+The internal structure of version objects is a blessed hash with several
+components:
+.PP
+.Vb 11
+\& bless( {
+\& \*(Aqoriginal\*(Aq => \*(Aqv1.2.3_4\*(Aq,
+\& \*(Aqalpha\*(Aq => 1,
+\& \*(Aqqv\*(Aq => 1,
+\& \*(Aqversion\*(Aq => [
+\& 1,
+\& 2,
+\& 3,
+\& 4
+\& ]
+\& }, \*(Aqversion\*(Aq );
+.Ve
+.IP original 4
+.IX Item "original"
+A faithful representation of the value used to initialize this version
+object. The only time this will not be precisely the same characters
+that exist in the source file is if a short dotted-decimal version like
+v1.2 was used (in which case it will contain 'v1.2'). This form is
+\&\fBSTRONGLY\fR discouraged, in that it will confuse you and your users.
+.IP qv 4
+.IX Item "qv"
+A boolean that denotes whether this is a decimal or dotted-decimal version.
+See "\fBis_qv()\fR" in version.
+.IP alpha 4
+.IX Item "alpha"
+A boolean that denotes whether this is an alpha version. NOTE: that the
+underscore can only appear in the last position. See "\fBis_alpha()\fR" in version.
+.IP version 4
+.IX Item "version"
+An array of non-negative integers that is used for comparison purposes with
+other version objects.
+.SS "Replacement UNIVERSAL::VERSION"
+.IX Subsection "Replacement UNIVERSAL::VERSION"
+In addition to the version objects, this modules also replaces the core
+UNIVERSAL::VERSION function with one that uses version objects for its
+comparisons. The return from this operator is always the stringified form
+as a simple scalar (i.e. not an object), but the warning message generated
+includes either the stringified form or the normal form, depending on how
+it was called.
+.PP
+For example:
+.PP
+.Vb 2
+\& package Foo;
+\& $VERSION = 1.2;
+\&
+\& package Bar;
+\& $VERSION = "v1.3.5"; # works with all Perl\*(Aqs (since it is quoted)
+\&
+\& package main;
+\& use version;
+\&
+\& print $Foo::VERSION; # prints 1.2
+\&
+\& print $Bar::VERSION; # prints 1.003005
+\&
+\& eval "use foo 10";
+\& print $@; # prints "foo version 10 required..."
+\& eval "use foo 1.3.5; # work in Perl 5.6.1 or better
+\& print $@; # prints "foo version 1.3.5 required..."
+\&
+\& eval "use bar 1.3.6";
+\& print $@; # prints "bar version 1.3.6 required..."
+\& eval "use bar 1.004"; # note Decimal version
+\& print $@; # prints "bar version 1.004 required..."
+.Ve
+.PP
+IMPORTANT NOTE: This may mean that code which searches for a specific
+string (to determine whether a given module is available) may need to be
+changed. It is always better to use the built-in comparison implicit in
+\&\f(CW\*(C`use\*(C'\fR or \f(CW\*(C`require\*(C'\fR, rather than manually poking at \f(CW\*(C`class\->VERSION\*(C'\fR
+and then doing a comparison yourself.
+.PP
+The replacement UNIVERSAL::VERSION, when used as a function, like this:
+.PP
+.Vb 1
+\& print $module\->VERSION;
+.Ve
+.PP
+will also exclusively return the stringified form. See "Stringification"
+for more details.
+.SH "USAGE DETAILS"
+.IX Header "USAGE DETAILS"
+.SS "Using modules that use version.pm"
+.IX Subsection "Using modules that use version.pm"
+As much as possible, the version.pm module remains compatible with all
+current code. However, if your module is using a module that has defined
+\&\f(CW$VERSION\fR using the version class, there are a couple of things to be
+aware of. For purposes of discussion, we will assume that we have the
+following module installed:
+.PP
+.Vb 4
+\& package Example;
+\& use version; $VERSION = qv(\*(Aq1.2.2\*(Aq);
+\& ...module code here...
+\& 1;
+.Ve
+.IP "Decimal versions always work" 4
+.IX Item "Decimal versions always work"
+Code of the form:
+.Sp
+.Vb 1
+\& use Example 1.002003;
+.Ve
+.Sp
+will always work correctly. The \f(CW\*(C`use\*(C'\fR will perform an automatic
+\&\f(CW$VERSION\fR comparison using the floating point number given as the first
+term after the module name (e.g. above 1.002.003). In this case, the
+installed module is too old for the requested line, so you would see an
+error like:
+.Sp
+.Vb 1
+\& Example version 1.002003 (v1.2.3) required\-\-this is only version 1.002002 (v1.2.2)...
+.Ve
+.IP "Dotted-Decimal version work sometimes" 4
+.IX Item "Dotted-Decimal version work sometimes"
+With Perl >= 5.6.2, you can also use a line like this:
+.Sp
+.Vb 1
+\& use Example 1.2.3;
+.Ve
+.Sp
+and it will again work (i.e. give the error message as above), even with
+releases of Perl which do not normally support v\-strings (see "What about v\-strings?" above). This has to do with that fact that \f(CW\*(C`use\*(C'\fR only checks
+to see if the second term \fIlooks like a number\fR and passes that to the
+replacement UNIVERSAL::VERSION. This is not true in Perl 5.005_04,
+however, so you are \fBstrongly encouraged\fR to always use a Decimal version
+in your code, even for those versions of Perl which support the Dotted-Decimal
+version.
+.SS "Object Methods"
+.IX Subsection "Object Methods"
+.IP \fBnew()\fR 4
+.IX Item "new()"
+Like many OO interfaces, the \fBnew()\fR method is used to initialize version
+objects. If two arguments are passed to \f(CWnew()\fR, the \fBsecond\fR one will be
+used as if it were prefixed with "v". This is to support historical use of the
+\&\f(CW\*(C`qw\*(C'\fR operator with the CVS variable \f(CW$Revision\fR, which is automatically
+incremented by CVS every time the file is committed to the repository.
+.Sp
+In order to facilitate this feature, the following
+code can be employed:
+.Sp
+.Vb 1
+\& $VERSION = version\->new(qw$Revision: 2.7 $);
+.Ve
+.Sp
+and the version object will be created as if the following code
+were used:
+.Sp
+.Vb 1
+\& $VERSION = version\->new("v2.7");
+.Ve
+.Sp
+In other words, the version will be automatically parsed out of the
+string, and it will be quoted to preserve the meaning CVS normally
+carries for versions. The CVS \f(CW$Revision\fR$ increments differently from
+Decimal versions (i.e. 1.10 follows 1.9), so it must be handled as if
+it were a Dotted-Decimal Version.
+.Sp
+A new version object can be created as a copy of an existing version
+object, either as a class method:
+.Sp
+.Vb 2
+\& $v1 = version\->new(12.3);
+\& $v2 = version\->new($v1);
+.Ve
+.Sp
+or as an object method:
+.Sp
+.Vb 2
+\& $v1 = version\->new(12.3);
+\& $v2 = $v1\->new(12.3);
+.Ve
+.Sp
+and in each case, \f(CW$v1\fR and \f(CW$v2\fR will be identical. NOTE: if you create
+a new object using an existing object like this:
+.Sp
+.Vb 1
+\& $v2 = $v1\->new();
+.Ve
+.Sp
+the new object \fBwill not\fR be a clone of the existing object. In the
+example case, \f(CW$v2\fR will be an empty object of the same type as \f(CW$v1\fR.
+.IP \fBqv()\fR 4
+.IX Item "qv()"
+An alternate way to create a new version object is through the exported
+\&\fBqv()\fR sub. This is not strictly like other q? operators (like qq, qw),
+in that the only delimiters supported are parentheses (or spaces). It is
+the best way to initialize a short version without triggering the floating
+point interpretation. For example:
+.Sp
+.Vb 2
+\& $v1 = qv(1.2); # v1.2.0
+\& $v2 = qv("1.2"); # also v1.2.0
+.Ve
+.Sp
+As you can see, either a bare number or a quoted string can usually
+be used interchangeably, except in the case of a trailing zero, which
+must be quoted to be converted properly. For this reason, it is strongly
+recommended that all initializers to \fBqv()\fR be quoted strings instead of
+bare numbers.
+.Sp
+To prevent the \f(CWqv()\fR function from being exported to the caller's namespace,
+either use version with a null parameter:
+.Sp
+.Vb 1
+\& use version ();
+.Ve
+.Sp
+or just require version, like this:
+.Sp
+.Vb 1
+\& require version;
+.Ve
+.Sp
+Both methods will prevent the \fBimport()\fR method from firing and exporting the
+\&\f(CWqv()\fR sub.
+.PP
+For the subsequent examples, the following three objects will be used:
+.PP
+.Vb 3
+\& $ver = version\->new("1.2.3.4"); # see "Quoting Rules"
+\& $alpha = version\->new("1.2.3_4"); # see "Alpha Versions"
+\& $nver = version\->new(1.002); # see "Decimal Versions"
+.Ve
+.IP "Normal Form" 4
+.IX Item "Normal Form"
+For any version object which is initialized with multiple decimal
+places (either quoted or if possible v\-string), or initialized using
+the \fBqv()\fR operator, the stringified representation is returned in
+a normalized or reduced form (no extraneous zeros), and with a leading 'v':
+.Sp
+.Vb 6
+\& print $ver\->normal; # prints as v1.2.3.4
+\& print $ver\->stringify; # ditto
+\& print $ver; # ditto
+\& print $nver\->normal; # prints as v1.2.0
+\& print $nver\->stringify; # prints as 1.002,
+\& # see "Stringification"
+.Ve
+.Sp
+In order to preserve the meaning of the processed version, the
+normalized representation will always contain at least three sub terms.
+In other words, the following is guaranteed to always be true:
+.Sp
+.Vb 3
+\& my $newver = version\->new($ver\->stringify);
+\& if ($newver eq $ver ) # always true
+\& {...}
+.Ve
+.IP Numification 4
+.IX Item "Numification"
+Although all mathematical operations on version objects are forbidden
+by default, it is possible to retrieve a number which corresponds
+to the version object through the use of the \f(CW$obj\fR\->numify
+method. For formatting purposes, when displaying a number which
+corresponds a version object, all sub versions are assumed to have
+three decimal places. So for example:
+.Sp
+.Vb 2
+\& print $ver\->numify; # prints 1.002003004
+\& print $nver\->numify; # prints 1.002
+.Ve
+.Sp
+Unlike the stringification operator, there is never any need to append
+trailing zeros to preserve the correct version value.
+.IP Stringification 4
+.IX Item "Stringification"
+The default stringification for version objects returns exactly the same
+string as was used to create it, whether you used \f(CWnew()\fR or \f(CWqv()\fR,
+with one exception. The sole exception is if the object was created using
+\&\f(CWqv()\fR and the initializer did not have two decimal places or a leading
+\&'v' (both optional), then the stringified form will have a leading 'v'
+prepended, in order to support round-trip processing.
+.Sp
+For example:
+.Sp
+.Vb 7
+\& Initialized as Stringifies to
+\& ============== ==============
+\& version\->new("1.2") 1.2
+\& version\->new("v1.2") v1.2
+\& qv("1.2.3") 1.2.3
+\& qv("v1.3.5") v1.3.5
+\& qv("1.2") v1.2 ### exceptional case
+.Ve
+.Sp
+See also UNIVERSAL::VERSION, as this also returns the stringified form
+when used as a class method.
+.Sp
+IMPORTANT NOTE: There is one exceptional cases shown in the above table
+where the "initializer" is not stringwise equivalent to the stringified
+representation. If you use the \f(CW\*(C`qv\*(C'\fR() operator on a version without a
+leading 'v' \fBand\fR with only a single decimal place, the stringified output
+will have a leading 'v', to preserve the sense. See the "\fBqv()\fR" operator
+for more details.
+.Sp
+IMPORTANT NOTE 2: Attempting to bypass the normal stringification rules by
+manually applying \fBnumify()\fR and \fBnormal()\fR will sometimes yield
+surprising results:
+.Sp
+.Vb 1
+\& print version\->new(version\->new("v1.0")\->numify)\->normal; # v1.0.0
+.Ve
+.Sp
+The reason for this is that the \fBnumify()\fR operator will turn "v1.0"
+into the equivalent string "1.000000". Forcing the outer version object
+to \fBnormal()\fR form will display the mathematically equivalent "v1.0.0".
+.Sp
+As the example in "\fBnew()\fR" shows, you can always create a copy of an
+existing version object with the same value by the very compact:
+.Sp
+.Vb 1
+\& $v2 = $v1\->new($v1);
+.Ve
+.Sp
+and be assured that both \f(CW$v1\fR and \f(CW$v2\fR will be completely equivalent,
+down to the same internal representation as well as stringification.
+.IP "Comparison operators" 4
+.IX Item "Comparison operators"
+Both \f(CW\*(C`cmp\*(C'\fR and \f(CW\*(C`<=>\*(C'\fR operators perform the same comparison between
+terms (upgrading to a version object automatically). Perl automatically
+generates all of the other comparison operators based on those two.
+In addition to the obvious equalities listed below, appending a single
+trailing 0 term does not change the value of a version for comparison
+purposes. In other words "v1.2" and "1.2.0" will compare as identical.
+.Sp
+For example, the following relations hold:
+.Sp
+.Vb 7
+\& As Number As String Truth Value
+\& \-\-\-\-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\-\-
+\& $ver > 1.0 $ver gt "1.0" true
+\& $ver < 2.5 $ver lt true
+\& $ver != 1.3 $ver ne "1.3" true
+\& $ver == 1.2 $ver eq "1.2" false
+\& $ver == 1.2.3.4 $ver eq "1.2.3.4" see discussion below
+.Ve
+.Sp
+It is probably best to chose either the Decimal notation or the string
+notation and stick with it, to reduce confusion. Perl6 version objects
+\&\fBmay\fR only support Decimal comparisons. See also "Quoting Rules".
+.Sp
+WARNING: Comparing version with unequal numbers of decimal points (whether
+explicitly or implicitly initialized), may yield unexpected results at
+first glance. For example, the following inequalities hold:
+.Sp
+.Vb 2
+\& version\->new(0.96) > version\->new(0.95); # 0.960.0 > 0.950.0
+\& version\->new("0.96.1") < version\->new(0.95); # 0.096.1 < 0.950.0
+.Ve
+.Sp
+For this reason, it is best to use either exclusively "Decimal Versions" or
+"Dotted-Decimal Versions" with multiple decimal points.
+.IP "Logical Operators" 4
+.IX Item "Logical Operators"
+If you need to test whether a version object
+has been initialized, you can simply test it directly:
+.Sp
+.Vb 2
+\& $vobj = version\->new($something);
+\& if ( $vobj ) # true only if $something was non\-blank
+.Ve
+.Sp
+You can also test whether a version object is an alpha version, for
+example to prevent the use of some feature not present in the main
+release:
+.Sp
+.Vb 3
+\& $vobj = version\->new("1.2_3"); # MUST QUOTE
+\& ...later...
+\& if ( $vobj\->is_alpha ) # True
+.Ve
+.SH AUTHOR
+.IX Header "AUTHOR"
+John Peacock <jpeacock@cpan.org>
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+perl.