Meta Architecture
-----------------

The meta objects (located in src/core/meta) e.g. Meta::Track and the more
often used Meta::TrackPtr represent data connected to music related objects.

There are classes for Tracks, Albums, Artists, Composers, Genres, Years and Labels.
These classes all derive from Meta::Base to facilitate their common methods (name
and sorting) and observer interaction.

[Design decision] They are not QObjects to avoid the overhead of the Qt MetaObject
support variables. Collections are potentially millions of tracks where a significant
proportion of tracks (in the case of MemoryCollections: all tracks) could at any time
be loaded in memory.

Meta::Observer is a virtual class that can be derived from by components that are
interested in changes to the tracks during application lifetime. It has
metadataChanged() methods for each of the Meta types and the ability to subscribe
to any Meta object.

KSharedPtr is used for all functions returning a pointer in the Meta classes. It strong,
reference tracking smart pointer which will only delete an object once the last reference
holding KSharedPtr goes out of scope or is deleted.

[Note] Playlists will be made part of Meta as well. They have a similar Observer
pattern but have been kept seperate because PlaylistObserver requires more functions.
Pollution of the Observer class could be avoided using a playlistChanged(enum Change,
QVariant value) type method.

[Design decision] The list of meta objects contains Tracks, Albums, Artists, Composers,
Genres, Years and Labels because these are the categories that you can sort by in
the collection view and thus have to be returned by the QueryMaker and represented
in an item in the CollectionTreeItem.

