#region
using System.Collections.Generic;
using System.Linq;
#endregion
namespace ScriptSDK
{
public class CoreObject
{
internal Dictionary<CoreAttribut, object> _datatable;
public CoreMode Mode
{
get { return GetValue<CoreMode>(CoreAttribut.CoreMode); }
set { SetValue(CoreAttribut.CoreMode, value); }
}
protected void SetValue<T>(CoreAttribut attrib, T value)
{
if (_datatable.ContainsKey(attrib))
_datatable[attrib] = value;
}
protected T GetValue<T>(CoreAttribut attrib)
{
if (attrib.Equals(CoreAttribut.CoreMode))
return (T) _datatable[attrib];
if (!_datatable.ContainsKey(attrib))
return (T) GetRawValue(attrib);
if (Mode.Equals(CoreMode.Auto))
_datatable[attrib] = GetRawValue(attrib);
return (T) _datatable[attrib];
}
protected virtual object GetRawValue(CoreAttribut attrib)
{
switch (attrib)
{
case CoreAttribut.CoreMode:
return CoreMode.Auto;
}
return new object();
}
public void Update()
{
if (!Mode.Equals(CoreMode.Auto))
return;
var a = _datatable.Keys.ToList();
foreach (var o in a)
{
var k = o;
if (!k.Equals(CoreAttribut.CoreMode))
SetValue(k, GetRawValue(k));
}
}
protected void Register(CoreAttribut attrib)
{
if (!_datatable.ContainsKey(attrib))
_datatable.Add(attrib, new object());
}
protected void Register<T>(CoreAttribut attrib, T value)
{
Register(attrib);
SetValue(attrib, value);
}
public T Clone<T>() where T : CoreObject
{
const CoreAttribut att = CoreAttribut.CoreMode;
var val = GetValue<CoreMode>(att);
if (val.Equals(CoreMode.Auto))
Mode = CoreMode.Clone;
var obj = CreateInstance();
foreach (var o in _datatable.Keys)
{
var k = o;
obj._datatable[k] = _datatable[k];
}
if (val.Equals(CoreMode.Auto))
Mode = CoreMode.Auto;
return (T) obj;
}
protected virtual CoreObject CreateInstance()
{
return new CoreObject();
}
public override string ToString()
{
return "";
}
public CoreObject()
{
_datatable = new Dictionary<CoreAttribut, object>();
Register(CoreAttribut.CoreMode, CoreMode.Auto);
}
}
}