docs: function withHelper(context, options) {
        var bindContext, preserveContext, controller;
        var helperName = 'with';
  
        if (arguments.length === 4) {
          var keywordName, path, rootPath, normalized, contextPath;
  
          Ember.assert("If you pass more than one argument to the with helper, it must be in the form #with foo as bar", arguments[1] === "as");
          options = arguments[3];
          keywordName = arguments[2];
          path = arguments[0];
  
          if (path) {
            helperName += ' ' + path + ' as ' + keywordName;
          }
  
          Ember.assert("You must pass a block to the with helper", options.fn && options.fn !== Handlebars.VM.noop);
  
          var localizedOptions = o_create(options);
          localizedOptions.data = o_create(options.data);
          localizedOptions.data.keywords = o_create(options.data.keywords || {});
  
          if (isGlobalPath(path)) {
            contextPath = path;
          } else {
            normalized = normalizePath(this, path, options.data);
            path = normalized.path;
            rootPath = normalized.root;
  
            // This is a workaround for the fact that you cannot bind separate objects
            // together. When we implement that functionality, we should use it here.
            var contextKey = jQuery.expando + guidFor(rootPath);
            localizedOptions.data.keywords[contextKey] = rootPath;
            // if the path is '' ("this"), just bind directly to the current context
            contextPath = path ? contextKey + '.' + path : contextKey;
          }
  
          localizedOptions.hash.keywordName = keywordName;
          localizedOptions.hash.keywordPath = contextPath;
  
          bindContext = this;
          context = contextPath;
          options = localizedOptions;
          preserveContext = true;
        } else {
          Ember.assert("You must pass exactly one argument to the with helper", arguments.length === 2);
          Ember.assert("You must pass a block to the with helper", options.fn && options.fn !== Handlebars.VM.noop);
  
          helperName += ' ' + context;
          bindContext = options.contexts[0];
          preserveContext = false;
        }
  
        options.helperName = helperName;
        options.isWithHelper = true;
  
        return bind.call(bindContext, context, options, preserveContext, exists);
      }