var Object = require ('./object');
var Param = require ('./param');
var Value = require ('./value');

/**
 * Simply a linkable value holder.
 **/
module.exports = new Class
({
	Extends: Object
	,Tag: 'vn-param'
	,Properties:
	{
		value:
		{
			type: String
			,set: function (x)
			{
				if (Value.compare (x, this._value))
					return;

				if (x instanceof Date)
					x = x.clone ();

				this._value = x;

				if (this._master && !this.masterLock)
				{
					this.masterLock = true;
					this._master.value = x;
					this.masterLock = false;
				}

				this.signalEmit ('changed', this._value);
			}
			,get: function ()
			{
				return this._value;
			}
		},
		master:
		{
			type: Param
			,set: function (x)
			{
				this.link ({_master: x}, {'changed': this._onMasterChange});
				this._onMasterChange ();
			}
			,get: function ()
			{
				return this._master;
			}
		}
	}

	,_value: undefined
	,_master: null
	,masterLock: false

	,_onMasterChange: function ()
	{
		if (this.masterLock)
			return;
	
		this.masterLock = true;
		this.value = this._master.value;
		this.masterLock = false;
	}
});