==============================================================================
                  Release of version 1.10 of Class::Contract
==============================================================================


NAME
    Class::Contract - Design-by-Contract OO in Perl

DESCRIPTION
    The Class::Contract module implements strong encapsulation, static
    inheritance, and design-by-contract condition checking for
    object-oriented Perl. The module provides a declarative syntax for
    attribute, method, constructor, and destructor definitions at both
    the object and class level. Pre-conditions, post-conditions, and
    class invariants are also fully supported.

AUTHOR
    Damian Conway (damian@conway.org)

MAINTAINER
    Garrett Goebel (ggoebel@cpan.org)

COPYRIGHT
    Copyright (c) 2000-2001, C. Garrett Goebel. All Rights Reserved. This
    module is free software. It may be used, redistributed and/or modified
    under the terms of the Perl Artistic License (see
    http://www.perl.com/perl/misc/Artistic.html)

    Copyright (c) 1999-2000, Damian Conway. All Rights Reserved. This module
    is free software. It may be used, redistributed and/or modified under
    the terms of the Perl Artistic License (see
    http://www.perl.com/perl/misc/Artistic.html)


==============================================================================

CHANGES IN VERSION 1.01-1.10

  - Added missing <C>old</C>. It was documented but not implemented

  - &self is now only way to access object/class reference. Use
    self(self->next) instead of $_[0] = $_[0]->next.

  - refactored all condition checking to use <C>generic_check</C> function

  - revisted _inheritence and generic_check. Think I've finally got
    weakening pre-conditional checks working correctly. There is a good
    test covering this in t/method.t


1.04    Wed Jan 31 15:45:42 2001

  - Begun the process of writing extensive tests. Finding and
    fixing many bugs.

  - Calling a class accessor or method with an object reference
    will now auto-magically change &self into a class name reference.
    This was documented but not implemented. The converse, calling an
    object accessor or method with a class reference causes an assertion

  - Added keyword 'private'. Methods declared private can only be
    invoked by the class or its descendants.

  - Added optional exportation of shortcuts: scalar_attrs, array_attrs,
    hash_attrs, methods. Allows defining clauses like:
    abstract methods qw( foo bar baz );

  - Fixed inheritence of pre-condition and implementation sub-clauses.
    Sub-clauses weren't always inherited when the derived class
    failed to define one.

  - Fixed pre-condition checks. Satisfying self or any ancestor
    wasn't working correctly when either the ancestor or the
    derived class did not define any preconditions.

  - &inherits now croaks on circular references in inheritence

  - Rewrote _location so we can now use eval within the
    contract statement to generate attribs, methods, etc.

  - Post conditions and invariants can no longer modify by 
    reference a method's @_. Now conditional checks receive a
    @{[@_]} shallow copy.

  - Fixed flyweight objects returned by constructor to avoid a
    dangling reference which was preventing garbage collection.

    The flyweight object is a blessed reference to $key which is
    itself a reference to an undefined lexical scalar. $key is
    also used as the hash key to the lexical %Class::Contract::data
    which stores a given object's data. Previously constructors
    returned $key. Consequently, when an object went out of scope
    in your script, %data continued to reference $key. Now, when the
    flyweight, which is not internally referenced by Class::Contract,
    goes out of scope its destructor clears $data{$key}, and Perl's
    garbage collection takes place. For a coherent explanation of 
    such issues read section 13.13 of the Perl Cookbook, 1st Edition.

  - Fixed multiple inheritence to appropriately handle cases where
    a descendant might inherit the same base class through 2 or 
    more intermediary classes. I.e. diamond patterns in inheritence
    tree. This affects inheritence of invars, attributes, methods,
    constructors, and destructors. Previously, it was possible to have
    a base class' initialization code called multiple times by a
    descendant's constructor. Once for each ancestor with the common
    base class. 

  - Fixed multiple inheritence with regard to constructor
    initialization to be left-most depth-first, instead of
    right-most depth-first. Destructors are the symetrical opposite
    right-most derived-first.


1.03  Wed Dec 27 14:06:11 2000

  - Reformatted source to new maintainer's tastes. 2 space indent
    and tabs, removal of barewords, foreach instead of for, etc.
    Otherwise no changes to the underlying code.


1.02  Fri Dec 21 10:22:48 2000

  - One line change to C<generic_precheck> to fix improper skipping 
    pre-conditional checks in some cases (thanks Jeff)


1.01  Fri Dec  9 09:52:02 2000

  - Change to generic constructor to work around magical limitations
    of overload.pm. Should now play nicer with overload.pm

  - Reversed ordering of Changes (this document)

  - Updated documentation to reflect probationary new maintainer
    C. Garrett Goebel, GGOEBEL, <ggoebel@cpan.org>

==============================================================================

AVAILABILITY

Class::Contract has been uploaded to the CPAN

==============================================================================
