private static void RenderEmptySection(object value, BindingContext context, Action<TextWriter, object> template)
 {
     if(IsFalseyOrEmpty(value) == false)
     {
         throw new HandlebarsRuntimeException("Tried to render a truthy or non-empty object in an inverted section");
     }
     template(context.TextWriter, null);
 }
 private static void InvokePartial(
     string partialName,
     BindingContext context,
     HandlebarsConfiguration configuration)
 {
     if(configuration.RegisteredTemplates.ContainsKey(partialName) == false)
     {
         throw new HandlebarsRuntimeException("Referenced partial name could not be resolved");
     }
     configuration.RegisteredTemplates[partialName](context.TextWriter, context);
 }
 private static void RenderSection(object value, BindingContext context, Action<TextWriter, object> template)
 {
     if(IsFalseyOrEmpty(value))
     {
         throw new HandlebarsRuntimeException("Tried to render a falsey or empty object in a section");
     }
     if(value is IEnumerable)
     {
         foreach(var item in ((IEnumerable)value))
         {
             template(context.TextWriter, item);
         }
     }
     else if(value != null)
     {
         template(context.TextWriter, value);
     }
     else
     {
         throw new HandlebarsRuntimeException("Could not render value for the section");
     }
 }
 public BindingContext(object value, TextWriter writer, BindingContext parent)
 {
     _value  = value;
     _writer = writer;
     _parent = parent;
 }
 public BindingContext(object value, TextWriter writer, BindingContext parent)
 {
     _value = value;
     _writer = writer;
     _parent = parent;
 }
 public ObjectEnumeratorBindingContext(BindingContext context)
     : base(context.Value, context.TextWriter, context.ParentContext)
 {
 }
        //TODO: make path resolution logic smarter
        private object ResolvePath(BindingContext context, string path)
        {
            if (_resolutionCache.ContainsKey(context) && _resolutionCache[context].ContainsKey(path))
            {
                return _resolutionCache[context][path];
            }
            var instance = context.Value;
            foreach(var segment in path.Split ('/'))
            {
                if(segment == "..")
                {
                    context = context.ParentContext;
                    if(context == null)
                    {
                        throw new HandlebarsCompilerException("Path expression tried to reference parent of root");
                    }
                }
                else if(segment == "this")
                {
                    continue;
                }
                else if (segment.StartsWith("@"))
                {
                    var contextValue = context.GetContextVariable(segment.Substring(1));
                    if (contextValue == null)
                    {
                        throw new HandlebarsRuntimeException("Couldn't bind to context variable");
                    }
                    instance = contextValue;
                    break;
                }
                else
                {
                    foreach (var memberName in segment.Split('.'))
                    {
                        try
                        {
                            instance = AccessMember(instance, memberName);
                        }
                        catch (Exception)
                        {
                            instance = new UndefinedBindingResult();
                            break;
                        }
                    }
                }
            }
            if (_resolutionCache.ContainsKey(context) == false)
            {
                _resolutionCache.Add(context, new Dictionary<string, object>());
            }
            _resolutionCache[context].Add(path, instance);
			return instance;
        }
 public ObjectEnumeratorBindingContext(BindingContext context)
     : base(context.Value, context.TextWriter, context.ParentContext)
 {
 }