# Source: documents/model.js

    "use strict";
    /**
     * @fileOverview A model is the first level if usable data-bearing entity in the system. It does NOT include any verbs for saving or anything like
     * that, it is a pure, in memory data container
     * @module documents/model
     * @require base
     * @require documents/probe
     * @require lodash
     */

    var Base = require( "../base" );
    var probe = require( "./probe" );
    var sys = require( "lodash" );
    /**
     * A model is the first level if usable data-bearing entity in the system. It does NOT include any verbs for saving or anything like
     * that, it is a pure, in memory data container
     * @exports documents/model
     * @constructor
     * @borrows module:documents/probe.get as get
     * @borrows module:documents/probe.set as set
     * @borrows module:documents/probe.any as any
     * @borrows module:documents/probe.all as all
     * @borrows module:documents/probe.remove as remove
     * @borrows module:documents/probe.seekKey as seekKey
     * @borrows module:documents/probe.seek as seek
     * @borrows module:documents/probe.findOne as findOne
     * @borrows module:documents/probe.findOneKey as findOneKey
     * @borrows module:documents/probe.findKeys as findKeys
     * @borrows module:documents/probe.find as find
     * @borrows module:documents/probe.update as update
     * @borrows module:documents/probe.some as some
     * @borrows module:documents/probe.every as every
     */
    var Model = Base.compose( [Base], /** @lends documents/model# */{
    	constructor : function () {
    		var that = this;
    		probe.mixin( this );

    		var idField = "_id";
    		/**
    		 * The name of the field that uniquely identifies a record. When provided, some operations will take advantage of it
    		 *
    		 * @name _idField
    		 * @memberOf  documents/model#
    		 * @type {string}
    		 * @private
    		 */
    		Object.defineProperty( this, "_idField", {
    			get          : function () {
    				return idField;
    			},
    			set          : function ( val ) {
    				idField = val;
    			},
    			configurable : false,
    			enumerable   : true,
    			writable     : true
    		} );

    		/**
    		 * The value of the primary key if {@link documents/model#_idField} is filled in. It will be null if none found
    		 *
    		 * @name _pkey
    		 * @memberOf  documents/model#
    		 * @type {*}
    		 * @private
    		 */
    		Object.defineProperty( this, "_pkey", {
    			get          : function () {
    				var val;
    				if ( !sys.isEmpty( that._idField ) ) {
    					val = that[that._idField];
    				}
    				return val;
    			},
    			set          : function ( val ) {
    				if ( !sys.isEmpty( that._idField ) ) {
    					that[that._idField] = val;
    				}
    			},
    			configurable : false,
    			enumerable   : true,
    			writable     : true
    		} );

    		/**
    		 * If {@link documents/model#_idField} is filled in and it's value is empty this will be true.
    		 * @type {boolean}
    		 * @name isNew
    		 * @memberOf  documents/model#
    		 */
    		Object.defineProperty( this, "isNew", {
    			get          : function () {
    				return !sys.isEmpty( that._idField ) && !sys.isEmpty( that[that._idField] )
    			},
    			configurable : false,
    			enumerable   : true,
    			writable     : false
    		} );

    		/**
    		 * Returns true if this instance is empty
    		 * @type {boolean}
    		 * @name isEmpty
    		 * @memberOf  documents/model#
    		 */
    		Object.defineProperty( this, "isEmpty", {
    			get          : function () {
    				return sys.isEmpty( that );
    			},
    			configurable : false,
    			enumerable   : true,
    			writable     : false
    		} );
    	}
    } );
    module.exports = Model;