/** @class Projection 
 *
 * A Projection describes the projection of a domain object in the application.
 * A Projection specifies the complete set of fields and relationships to be
 * instantiated when the operation with which it is used is executed.
 *
 * A *default* Projection is one where each field is specified. 
 *
 */
Projection = {
  domainObject       :  "" ,  /** function */
  error              :  "",   /** error report for this projection */
  fields             :  "" ,  /** field names */
  relationships      : null   /** relationships, which consist of a name and projection */
};


/** Projection constructor 
 *
 * @class Projection
 * @constructor
 * @param {function} [constructor] 
*/
function Projection(constructor) {};



/*****                      Projection methods 
                            --------------------                      *****/
  
/* @method addFields
   addFields(fields)
   IMMEDIATE
   
   Add fields by name to the projection
  
   @param fields String or [String]
   The fields parameter is the name of a field or an array of field names.  It can be a string
   or an array of strings. Multiple field names are accepted as parameters.

    @return {Projection} @chainable
    addFields() returns the current Projection object, so that method
    invocations can be chained.
*/
  function addFields(fields) {};

/* @method addField
   ALIAS for addFields for ease of use
   addField(fields)
   IMMEDIATE
   @see addFields
   
   Add fields to the projection
  
 */
  function addField(fields) {};


/* @method addRelationship
   addRelationship(name, projection)
   IMMEDIATE 
   
   Add a relationship to the projection.
   
   @param name {String} name of the relationship field in the domain object
   @param projection {Projection} the projection to be assigned to the relationship
   @return Projection @chainable
*/
  function addRelationship(name, projection) {};


/* This file is a JavaScript module */
exports.Projection = Projection;
