| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 | 
							- ================
 - Design decisions
 - ================
 - 
 - The central aim of oscar is to provide a solid core of an e-commerce project that can be
 - extended and customised to suit the domain at hand.  This is acheived in several ways:
 - 
 - Core models are abstract
 - ------------------------
 - 
 - Online shops can vary wildly, selling everything from turnips to concert
 - tickets.  Trying to define a set of Django models capable for modelling all such
 - scenarios is impossible - customisation is what matters.
 - 
 - One way to model your domain is to have enormous models that have fields for
 - every possible variation; however, this is unwieldy and ugly.  
 - 
 - Another is to use the Entity-Attribute-Value pattern to use add meta-data for each of 
 - your models.  However this is again ugly and mixes meta-data and data in your database (it's 
 - an SQL anti-pattern).
 - 
 - Oscar's approach to this problem is to have have minimal but abstract models
 - where all the fields are meaningful within any e-commerce domain.  Oscar then
 - provides a mechanism for subclassing these models within your application so
 - domain-specific fields can be added.
 - 
 - Specifically, in many of oscar's apps, there is an ``abstract_models.py`` module which
 - defines these abstract classes.  There is also an accompanying ``models.py`` which provides an
 - empty but concrete implementation of each abstract model.
 - 
 - Classes are loaded dynamically
 - ------------------------------
 - 
 - To enable sub-apps to be overridden, oscar classes are loading generically
 - using a special ``get_class`` function.  This looks at the
 - ``INSTALLED_APPS`` tuple to determine the appropriate app to load a class from.
 - 
 - Sample usage::
 - 
 -     from oscar.core.loading import get_class
 - 
 -     Repository = get_class('shipping.repository', 'Repository')
 -     
 - This is a replacement for the usual::
 - 
 -     from oscar.apps.shipping.repository import Repository
 - 
 - It is effectively an extension of Django's ``django.db.models.get_model``
 - function to work with arbitrary classes.
 -     
 - The ``get_class`` function looks through your ``INSTALLED_APPS`` for a matching module to
 - the one specified and will load the classes from there.  If the matching module is
 - not from oscar's core, then it will also fall back to the equivalent module if the
 - class cannot be found.
 - 
 - This structure enables a project to create a local ``shipping.repository`` module and 
 - subclass and extend the classes from ``oscar.app.shipping.repository``.  When Oscar
 - tries to load the ``Repository`` class, it will load the one from your local project.
 - 
 - All views are class-based
 - -------------------------
 - 
 - This enables any view to be subclassed and extended within your project.  
 - 
 - Templates can be overridden
 - ---------------------------
 - 
 - This is a common technique relying on the fact that the template loader can be
 - configured to look in your project first for templates, before it uses the defaults
 - from oscar.
 
 
  |