NAME
    DNS::ZoneSerialNumber - Manipulate DNS zone serial numbers.

SYNOPSIS
      use DNS::ZoneSerialNumber;
      my $zsn = DNS::ZoneSerialNumber->new(100);
      $zsn->increment();
      print "The new serial number is ", $zsn->serial, "\n";

DESCRIPTION
    DNS::ZoneSerialNumber encapsulates a DNS zone serial number and provides
    RFC 1982, 1912, and 2136 compliant manipulation, comparison, and
    validation methods. This module automatically handles serial number
    overflows, underflows, and invalid comparisons, as well as simple
    increments and decrements.

METHODS
  new
    Constructor for the DNS::ZoneSerialNumber object. Accepts a single
    optional parameter, the serial number that the object should represent.
    If not specified, defaults to 1. If an invalid serial number is
    specified, the method will croak.

    On success, returns the DNS::ZoneSerialNumber object.

  valid
    Accepts a single parameter, the serial number to test for validity.

    Returns true or false depending representing whether or not the
    specified serial number represents a valid serial number. Valid serial
    numbers are positive integers between 1 and SERIAL_MAX (inclusive). See
    CONSTANTS for details.

    Note: This method may be called statically or as an instance method.

  serial
    Accepts no parameters. Returns the represented serial number as a Perl
    scalar.

    Note: In string or numeric context, a DNS::ZoneSerialNumber object will
    return an appropriate representation of its serial number automatically.

  set
    Accepts a single parameter, the new serial number. Returns the
    DNS::ZoneSerialNumber object with the updated serial number.

    Sets the serial number represented by the object to the specified serial
    number. If the specified serial number is invalid the method will croak.

  set_from_date
    Accepts a single optional parameter, the revision count of the new
    date-based serial number. If an invalid revision count is specified (< 0
    or > 99), the method will croak. Returns the DNS::ZoneSerialNumber with
    the updated serial number.

    Sets the serial number represented by the object to a serial number
    based on the current date in the format specified by RFC 1912
    (YYYYMMDDnn). This format allows for a two-digit revision count (nn)
    which defaults to "00" unless specified.

  steps_to_set
    Accepts a single parameter, the new serial number. If the specified
    serial number is invalid, the method will croak. In array context,
    returns an in-order array of DNS::ZoneSerialNumber objects representing
    the serial numbers that must be set in order to safely set the specified
    serial number. In scalar context the number of required steps is
    returned.

    Due to the way RFC 1982 defines serial number comparisons, it is not
    possible to simply set a zone's serial number to any number considered
    less than the current serial number. If this is done, DNS servers will
    assume that the new serial number is older than the prior serial number.
    In order to set the serial number to a lower value without DNS servers
    believing the serial number is lower, it must first be set to a higher
    number (and eventually overflowed) and propagated out. This method
    generates the list of serial numbers that must be set, in order, to
    allow a serial number to be set to a lower value without DNS servers
    believing the serial number is older. On success, this method
    necessarily returns an array of 1 or 2 elements (or the numbers 1 or 2
    in scalar context).

    If the specified serial number is greater than or equal to the
    represented serial number, no additional steps are required and an array
    of a single element (or the number 1 in scalar context) is returned.

    Please note that because this module always avoids the serial number 0,
    it may compute a different set of increments to arrive at the specified
    serial number than other tools.

    For more information see RFC 1982.

  incomparable
    Accepts no parameters. Returns a DNS::ZoneSerialNumber object
    representing the incomparable value for the currently represented serial
    number.

    See RFC 1982 for more information about incomparable serial numbers.

  is_incomparable
    Accepts a single parameter, the serial number against which the
    represented serial number should be checked for incomparability. If the
    specified serial number is invalid, the method will croak.

    Returns true if the serial numbers are incomparable or false otherwise.

    See RFC 1982 for more information about incomparable serial numbers.

  next
    Accepts a single optional parameter, the amount to increment by (n). If
    no parameter is specified, the amount defaults to 1. If an invalid
    amount is specified, the method will croak. Please see CONSTANTS for
    details. Returns the next nth serial number in sequence as a
    DNS::ZoneSerialNumber object. The currently represented serial number is
    unchanged.

    If the serial number overflows the serial maximum it will automatically
    roll over through the serial minimum.

    This method is also available as the overloaded operator "+". Please
    note that the protections against invalid increments can be circumvented
    via compound addition using the overloaded methods. For example, the
    following will succeed even though it results in an invalid increment
    due to the fact the addition was done in multiple steps:

     my $new_zsn = $zsn + DNS::ZoneSerialNumber::INCREMENT_MAX + 1;

    However, the following will (correctly) generate an error:

     my $new_zsn = $zsn + ( DNS::ZoneSerialNumber::INCREMENT_MAX + 1 );

  previous
    Accepts a single optional parameter, the amount to decrement by (n). If
    no parameter is specified, the amount defaults to 1. If an invalid
    amount is specified, the method will croak. Please see CONSTANTS for
    details. Returns the prior nth serial number in sequence as a
    DNS::ZoneSerialNumber object. The currently represented serial number is
    unchanged.

    If the serial number underflows the serial minimum it will automatically
    roll over through the serial maximum.

    This method is also available as the overloaded operator "-".

  increment
    Accepts a single optional parameter, the amount to increment by (n). If
    no parameter is specified, the amount defaults to 1. If an invalid
    amount is specified, the method will croak. Please see CONSTANTS for
    details. Sets the currently represented serial number to the nth next
    serial number in sequence and returns the DNS::ZoneSerialNumber object
    with the updated value.

    If the serial number overflows the serial maximum it will automatically
    roll over through the serial minimum.

    This method is also available as the overloaded operator "++".

  decrement
    Accepts a single optional parameter, the amount to decrement by (n). If
    no parameter is specified, the amount defaults to 1. If an invalid
    amount is specified, the method will croak. Please see CONSTANTS for
    details. Sets the currently represented serial number to the nth prior
    serial number in sequence and returns the DNS::ZoneSerialNumber object
    with the updated value.

    If the serial number underflows the serial minimum it will automatically
    roll over through the serial maximum.

    This method is also available as the overloaded operator "--".

  compare
    Accepts a single parameter, the serial number to be compared against the
    one represented by the DNS::ZoneSerialNumber object. If the supplied
    serial number is invalid, the method will croak.

    This method's behavior is the same as the <=> operator, however in the
    case of incomparable numbers undef is returned. This method is also
    available as the overloaded operator "<=>".

  Overloaded Comparison Methods
    All of the following methods accept a single argument, the serial number
    to be compared against the one represented by the DNS::ZoneSerialNumber
    object. If the supplied serial number is invalid, the method will croak.

    Each method true or false as a result of the comparison. In the case of
    incomparable numbers, false is returned by all methods except "ne (!=)".
    All of the following methods are also available as overloaded comparison
    operators.

    The comparison is performed with the encapsulated serial number treated
    as the left operand. For example:

     $zsn->gt(100)

    Is the equivalent of writing:

     $zsn > 100

    The following methods are available:

   gt (>)
   gte (>=)
   lt (<)
   lte (<=)
   eq (==)
   ne (!=)
CONSTANTS
    DNS::ZoneSerialNumber contains the following internal constants
    representing definitions and rules used by DNS::ZoneSerialNumber and RFC
    1982. These constants are not exported but are available if accessed via
    the full namespace (eg, DNS::ZoneSerialNumber::SERIAL_BITS).

  SERIAL_BITS
    The number of bits used to represent a DNS zone serial number. Set at
    32.

  SERIAL_MAX
    The maximum value a serial number of SERIAL_BITS size can store.
    Computed as:

     ( 2 ** SERIAL_MAX ) - 1

  SERIAL_HALF
    Approximately half the serial maximum value as used in RFC 1982 equality
    calculations. This value is used in serial number comparisons and in
    calculating incomparable serial numbers. Computed as:

     2 ** ( SERIAL_BITS - 1 )

  INCREMENT_MAX
    The maximum amount by which a serial number can be incremented in a
    single step. If incremented by more than this amount, the serial number
    would appear to have gone "backwards", see RFC 1982 for details.
    Computed as:

     ( 2 ** ( SERIAL_BITS - 1 ) ) - 1

SERIAL NUMBER 0
    As per RFC 2136, the serial number 0 is not used and is skipped for all
    additive and subtractive calculations. For example, if a
    DNS::ZoneSerialNumber object representing the serial number SERIAL_MAX
    is then incremented by 1, the new serial number will be set to 1 rather
    than 0.

    Comparisons will still take serial number 0 into account as expected.

INVALID COMPARISONS
    The serial number logic provided by RFC 1982 defines two serial numbers
    with a difference of ( 2 ** SERIAL_MAX ) to be considered neither
    greater than, less than, nor equal to each other. The RFC provides no
    recommendations on how to handle comparisons of these numbers and
    suggests they not be compared directly or used together in the same
    environment. DNS::ZoneSerialNumber attempts to compare these serial
    numbers using the same logic that BIND uses: all comparison methods will
    return false for any comparison of these serial number pairs, except for
    "ne (!=)" which returns true, and compare (<=>) which returns undef.

OPERATOR OVERLOADING
    DNS::ZoneSerialNumber provides overloaded operators for many of its
    provided methods. The author is currently unsure as to whether or not
    this is a good idea. If it proves to be problematic, the overloads may
    be removed (or made optional) in a future version.

CHANGES
  1.01 - 20120120, jeagle
    Minor documentation updates.

  1.00 - 20120118, jeagle
    Initial release to CPAN.

SEE ALSO
    DNS::ZoneParse, Net::DNS, RFC 1982, RFC 1912, RFC 2136

AUTHOR
    John Eaglesham

COPYRIGHT AND LICENSE
    Copyright (C) 2011-2012 by John Eaglesham

    This library is free software; you can redistribute it and/or modify it
    under the same terms as Perl itself, either Perl version 5.6.0 or, at
    your option, any later version of Perl 5 you may have available.

