/*
         * var partial = Handlebars.partials[path];
         *      if (typeof partial !== 'function') {
         *          partial = Handlebars.compile(partial);
         *      }
         *      return partial(context);
         */

        public ModPartial()
        {
            HandlebarsDotNet.Handlebars.RegisterHelper("modPartial", (writer, context, parameters) =>
            {
                if (parameters.Length >= 3)
                {
                    var _ref = string.Empty;
                    if (parameters[0] != null)
                    {
                        _ref = parameters[0].ToString();
                    }

                    if (_ref == string.Empty)
                    {
                        var vmType = parameters[1].GetType();
                        if (vmType.IsArray)
                        {
                            vmType = vmType.GetElementType();
                        }

                        if (vmType.IsGenericType)
                        {
                            vmType = vmType.GetGenericArguments().FirstOrDefault();
                        }

                        _ref = vmType.Name.Replace("vmBlock_", "par");
                    }

                    var r = HandlebarsDotNet.Handlebars.Configuration.RegisteredTemplates
                            .Where(x => x.Key == _ref)
                            .Select(x => x.Value).FirstOrDefault();

                    if (r != null)
                    {
                        r(writer, PartialHelpers.GetDataModel(parameters) ?? parameters[1]);
                    }
                    else
                    {
                        throw new Exception(string.Format("Handlebars modifier partial cannot find partial {0}",
                                                          parameters[0]));
                    }
                }
                else
                {
                    throw new Exception(
                        "Handlebars modifier partial should have 3 parameters; partial name, content and modifier");
                }
            });
        }
        public DynPartial()
        {
            HandlebarsDotNet.Handlebars.RegisterHelper("dynPartial", (writer, context, parameters) =>
            {
                var _ref = string.Empty;
                if (parameters[0] != null)
                {
                    _ref = parameters[0].ToString();
                }

                if (_ref == string.Empty)
                {
                    var vmType = parameters[1].GetType();
                    if (vmType.IsArray)
                    {
                        vmType = vmType.GetElementType();
                    }

                    if (vmType.IsGenericType)
                    {
                        vmType = vmType.GetGenericArguments().FirstOrDefault();
                    }

                    _ref = vmType.Name.Replace("vmBlock_", "par");
                }

                var r = HandlebarsDotNet.Handlebars.Configuration.RegisteredTemplates
                        .Where(x => x.Key == _ref)
                        .Select(x => x.Value).FirstOrDefault();

                if (r == null)
                {
                    throw new Exception(string.Format("dynPartial error : Partial not found for ref {0}", _ref));
                }

                if (parameters.Length > 1)
                {
                    r(writer, PartialHelpers.GetDataModel(parameters, context) ?? parameters[1]);
                }
                else
                {
                    r(writer, context);
                }
            });
        }