"use strict";
/**
 * @fileOverview This is base definition for all composed classes defined by the system
 * @module base
 * @requires base/chains
 * @requires dcl
 */

var dcl = require( "dcl" );
var chains = require( "./chains" );

/**
 * @classdesc The base of all classes in the system, this is one of the few pure "classes" in core the of the system. It is a
 * pretty clean little class whose primary purpose is to surface the composition chains and a basis for storing
 * options on mixin and subclass instances. Options are handled at the instance rather than the prototype level
 * so that multiple instances don't compete for default values.
 *
 * @exports base
 * @constructor
 * @extends base/chains
 */
var Base = dcl( [chains], /** @lends base# */{
	declaredClass     : "Base",
	/**
	 * Add an option to a class. If any members of the hash already exist in `this.options`, they will be overwritten.
	 * @param {hash} options A hash of options you want to set
	 * @see {base#addDefaultOptions}
	 */
	addOptions        : function ( options ) {
		options = options || {};
		if ( this.options ) {options = sys.extend( {}, sys.result( this, 'options' ), options );}
		this.options = options;
	},
	/**
	 * Add a default option to a class. The default options are only set if there is not already a
	 * value for the option.
	 * @param {hash} options A hash of options you want to set
	 * @see {base#addOptions}
	 */
	addDefaultOptions : function ( options ) {
		options = options || {};
		if ( this.options ) {options = sys.defaults( {}, sys.result( this, 'options' ), options );}
		this.options = options;
	},

	/**
	 * Call this to close your object and dispose of all maintained resources. You can define this method on your
	 * own classes without having to call the superclass instance, however it is reccomended that you put
	 * all disposal code in `destroy()`. You must be disciplined about calling this on your instances.
	 * @see {base/chains#end}
	 * @see {base/chains#destroy}
	 */
	end : function () {
		this.destroy()
	},

	/**
	 * Called when it is time to get rid of all of your instance level references and objects and events. You can
	 * define this method on your own classes without having to call the superclass instance. It is called by
	 * `instance.end()` automatically
	 * @see {base/chains#end}
	 * @see {base/chains#destroy}
	 */
	destroy : function () {

	}


} );

Base.compose = dcl;
Base.mixin = dcl.mix;
module.exports = Base;