# Change log

All of the changes to the `metamagical-interface` project are recorded in
this file. Changes are ordered from most recent to oldest versions.

(This will eventually be autogenerated)

> **Why does this changelog start at 3.x?**
>
> Versions older than 3.x were experimental and, while public, not
> announced as a release.


## 3.x

The 3.x series introduces the object-oriented architecture used by
the Interface module, by consolidating things such as metadata
inheritance and propagation that were already used by other projects.


### [3.4.0] - 2016-07-09

  - Added `parents` and `hierarchy`.
  
  - Added minimal annotations for built-in hierarchy.


### [3.3.0] - 2016-05-27

#### Added

  - Added missing documentation to all objects in the interface.

  - Added `isRequired` to keep track of unimplemented functionality. This is
    important to prevent tools from accessing getters that are there only to
    provide documentation on the object's layout (`Field.name` is an example).

  - Automatically running documentation examples so they don't get out of date.

  - Added a specific Makefile for Interface.

  - A set of primitive wrappers that allows Interface to deal with primitive
    objects in a limited way. This simplifies the work tooling has to do to
    explore an object without having things explode when encountering a
    primitive.

#### Changed

  - `copyright`, `licence`, and `platforms` are not propagated anymore.
    Previously these were propagated because sometimes people want to know
    all of the licences an object has, or all of the platforms an object runs
    on, but there's no reasonable way of merging these fields, and it highly
    depends on the questions being asked.

  - `authors` and `maintainers` now require their arguments to be a Person object.

  - Fixed incorrect and outdated example code.

  - Sorts `(Uncategorised)` last.




### [3.2.1] - 2016-05-18

#### Added

  - Added the `allProperties` method to `Interface`, which retrieves all
    properties of an object, categorised. Previously the Interface only exposed
    `properties`, which returned own properties categorised, but ignored
    inherited properties. This made tools do a lot of unnecessary work to
    compute the inherited properties.

#### Changed

  - Interface now only looks at metadata that is associated directly with
    the object throught the `meta:magical` symbol. Previously it also returned
    metadata that was associated with the `[[Prototype]]` of that object,
    which resulted in the wrong information being shown.



### [3.1.0] - 2016-05-16

#### Added

  - Added the `isModule` metadata for tracking whether an object is also a module.
    Required for tools to handle correctly how to show an object in the presence of
    CommonJS modules, where a function may double as a module, for example.



### [3.0.3] - 2016-05-14

#### Changed

  - Fixed a bug with attaching new metadata to an object, which was still
    using the old interface.

  - Fixed a bug with the propagation of author metadata, where the arrays
    where not properly merged.



### [3.0.2] - 2016-05-14

#### Changed

  - Fixed a bug with the inheritance of metadata in `Interface`.



### [3.0.1] - 2016-05-14

### Changed

  - Fixed a bug with the propagation of metadata in `Interface` and
    in the `stability` field, where the thunk was not being forced,
    and thus no metadata was inherited.



### [3.0.0] - 2016-05-14

#### Added

  - An `Interface` object, which provides metadata for an object,
    and supports the concept of `Fields` for describing how to
    propagate and inherit metadata;
  - A `Stability` object describing the stability index;
  - A `Field` object to describe fields;
  - And a set of common fields used by Meta:Magical projects, in the
    `fields` module.