
var VnObject = require ('./object');
var LotIface = require ('./lot-iface');
var Value = require ('./value');

module.exports = new Class
({
	Extends: VnObject
	,Implements: LotIface
	,Tag: 'vn-lot'
	,Properties:
	{
		params:
		{ 
			type: Object
			,set: function (x)
			{
				this.setAll (x);
			}
			,get: function ()
			{
				return this._params;
			}
		}
		,$:
		{
			type: Object
			,set: function (x)
			{
				this.setAll (x);
			}
			,get: function ()
			{
				return this._params;
			}
		}
	}

	,initialize: function (props)
	{
		this._params = {};
		this.parent (props);
	}
	
	,keys: function ()
	{
		return Object.keys (this._params);
	}

	,assign: function (params)
	{
		var diff = Value.partialDiff (this._params, params);

		if (diff)
		{
			Object.assign (this._params, diff);
			this._paramsChanged (diff);
			this.changed (diff);
		}
	}

	,setAll: function (params)
	{
		var diff = Value.diff (this._params, params);

		if (diff)
		{
			this._params = Value.kvClone (params);
			this._paramsChanged (diff);
			this.changed (diff);
		}
	}

	/**
	 * Called when lot params changes, can be implemented by child classes to be
	 * notified about changes.
	 * 
	 * @param {Object} diff Changed parameters and its new values
	 */
	,_paramsChanged: function () {}
});
