v0.4.4 17th July 2012
  - Added the dip.settings module.

v0.4.3 2nd July 2012
  - When adapting an object that is itself an adapter then it is the underlying
    object that is adapted.  This has a number of consequences the main one
    being that it is now safe to pass adapters around as arguments whereas
    before it was better to always pass the underlying unadapted object.
  - The value of a typed attribute with a type that is an instance of an
    interface is now the adapter (assuming the object needs adapting) rather
    than the underlying unadapted object.  This significantly reduces the need
    for explicit casting to an interface.
  - The unadapted() function has been added to dip.model to convert what may be
    an adapter to the underlying unadapted object.
  - Because of the above changes a view factory now returns an implementation
    of the dip.ui.IView interface rather than a toolkit specific object that
    can be adapted to that interface.
  - Added the TabPage factory to dip.pui.
  - Removed the ObjectFactory class from dip.ui.

v0.4.2 25th May 2012
  - Added the dip.publish module based on the old dip.shell publishing
    mechanism.
  - IController.auto_update_model will now automatically update the model when
    the editor is valid (rather than when all editors are valid).
  - IController.validate_view() is now intended specifically to implement
    cross-editor validation.
  - IController.update_view() has been added specifically to update the state
    of editors and views in response to changing values.
  - IController.is_valid() has been added to make it easier to write
    implementations of IController.update_view().
  - Controller will now use the tail of a dotted identifier when looking for
    specially named action, editor or view.
  - Added IValidator and the CollectionValidator, FilesystemLocationValidator,
    OptionValidator, StorageLocationValidator and StringValidator
    implementations.
  - Added IGrid and the Grid implementation.
  - Added IGroupBox.title.
  - IViewStack.views is now a list rather than a tuple.
  - ICodec.decode(), IStorage.read() and IIoManager.read() all allow None to be
    returned to specify that a read has been abandoned with user involvement.

v0.4.1 5th May 2012
  - Added the dip.io.BaseStorage class as an optional base class for storage
    implementations.
  - Added the read() and write() convenience methods to dip.io.IIoManager.
  - The signatures of the readable_locations_from_string(), readable_storage(),
    writeable_locations_from_string() and writeable_storage()  methods of
    IIoManager have changed.
  - The signatures of the readable_storage_location() and
    writeable_storage_location() methods of IIoManagerUi have changed.
  - Added support for relative paths when specifying types as strings.
  - Added the dip.model.TypeFactory.observed decorator.
  - The signature of the open() method of IShell has changed.
  - dip.ui.OptionSelectorFactory.options can now be a string which is the name
    of the attribute in the model containing the actual options.
  - A mapping proxy now maps an unrecognised type to Any rather than raising an
    exception.
  - A label's label policy is now embedded so that it is never displayed in a
    form.
  - Added the dip.ui.IView.ready attribute which is pulled when a view is being
    made visible for the first time.
  - Removed dip.ui.Application.call_after().

v0.4 7th April 2012
  - The dip.shell module has been rewritten.
  - The dip.ui module has been substantially rewritten and split into dip.ui,
    dip.pui and dip.toolkits.
  - The observer methods of dip.model.Trigger, dip.model.TypeFactory and
    dip.ui.Action (used as a decorator) have been removed as they do not work
    in all common cases.  The dip.model.observe decorator should be used
    instead.
  - Added the dip.model.Singleton class.
  - Added the dip.model.get_attribute_types function.
  - Added the dip.model.notify_observers function.
  - All the dip.model.ValueTypeFactory __init__ methods now support the
    allow_none, getter and setter arguments.
  - A limited form of adapter chaining is now supported.
  - The 'adapt' and 'cache' arguments have been added to adapter factories.

v0.3 7th June 2011
  - The dip.automation module and the dip-automate script have been added.
  - It is now possible to bind existing GUI's (i.e. those created manually or
    with Qt Designer) to a model.  It is no longer necessary to use the
    declarative functionality of the dip.ui module.
  - @implements now checks that an implementation contains all methods defined
    by an interface.
  - The dip.model.isadapted() function will check if an object has been adapted
    to an interface without creating an adapter as a side effect.
  - The dip.ui.DirectorySelector has been removed and its functionality merged
    with the dip.ui.FileSelector class.
  - A view factory will now always create a QWidget sub-class.  It is no longer
    necessary to pass the 'widget' argument to ensure a QWidget (rather than a
    QLayout) is created.
  - Default delegate editors have been added for the Int, Float, Bool and Enum
    types.
  - The IMessageArea interface has been added and the requirement that a
    message area is a QLabel has been removed.
  - ComboBox is now the default editor factory for the Enum type instead of
    RadioButtons.
  - The dip.ui.Wrapper class has been removed.
  - The dip.ui.CollectionToolButtons class has been renamed to
    CollectionButtons.
  - The dip.ui.AddToolButton class has been renamed to AddButton.
  - The dip.ui.RemoveToolButton class has been renamed to RemoveButton.
  - The dip.ui.UpToolButton class has been renamed to UpButton.
  - The dip.ui.DownToolButton class has been renamed to DownButton.
  - Editors are now views in their own right and there is no longer any need to
    place them in an explicit view.
  - The dip.model.Tuple class was added.

v0.2 8th September 2010
  - Python v2.6 and v2.7 are now supported.
  - Attribute observers are now only invoked if an attribute has actually
    changed.
  - Attribute observers are now passed an AttributeChange instance that fully
    describes the change to the attribute.
  - The _default_xxx() methods for identifying a method for providing an
    attribute's default value have been replaced by a type's 'default'
    decorator.
  - The _get_xxx() methods for identifying a method to be used as an
    attribute's getter have been replaced by a type's 'getter' decorator.
  - The _set_xxx() methods for identifying a method to be used as an
    attribute's setter have been replaced by a type's 'setter' decorator.
  - The _observe_xxx() methods for identifying a method to be used as an
    implicit observer of an attribute have been replaced by a type's 'observer'
    decorator.
  - Support for automatically invoking type factories has been removed.  For
    example, 'attribute = Str()' must be used instead of 'attribute = Str'.
  - Support for automatically invoking view item factories has been removed.
    For example, 'MessageArea()' must be used instead of 'MessageArea'.
  - 'Adaptor' has been renamed 'Adapter' throughout dip.
  - The dip.model.BaseType class has been renamed to TypeFactory.
  - The dip.model.ValueType class has been renamed to ValueTypeFactory.
  - The dip.model.ContainerType class has been renamed to ContainerTypeFactory.
  - The dip.model.MutableType class has been renamed to MutableTypeFactory.
  - The dip.model.ValueTypeFactory.default() method has been replaced by the
    __call__() method.
  - dip.model.ModelType has been removed as it is now equivalent to
    Instance(TypeFactory).
  - dip.model.TypeSpecificationError has been removed.
  - MetaInterface and MetaModel are now part of the dip.model API.
  - dip.plugins.Plugin now implements IPlugin so that sub-classes don't have
    to.
  - The default pickle protocol used is v2.

v0.1 17th July 2010
  - The first release.
