public object Lookup(string name)
{
object value = null;
if (Cache.ContainsKey(name))
{
value = Cache[name];
}
else
{
var context = this;
bool lookupHit = false;
while (context != null)
{
if (name.IndexOf('.') > 0)
{
var names = name.Split('.');
value = context.view;
for (var i = 0; i < names.Length; i++)
{
var tempValue = GetValueFromRegistry(value, names[i]);
if (tempValue != null)
{
if (i == names.Length - 1)
{
lookupHit = true;
}
value = tempValue;
}
else if (i > 0)
{
return null;
}
else
{
break;
}
}
}
else if (context.view != null)
{
value = GetValueFromRegistry(context.view, name);
if (value != null)
{
lookupHit = true;
}
}
if (lookupHit || RenderSettings.SkipRecursiveLookup)
{
break;
}
context = context.ParentContext;
}
value = TryEnumerationConversionIfRequired(value);
Cache[name] = value;
}
if (!RenderSettings.ThrowOnDataMiss || value != null)
{
return value;
}
var ex = new StubbleDataMissException($"'{name}' is undefined.");
ex.Data["Name"] = name;
ex.Data["SkipRecursiveLookup"] = RenderSettings.SkipRecursiveLookup;
throw ex;
}