     ###
 
     get_all_content = (types) ->
-      W.reduce types, (m, t) =>
+      W.map types, (t) =>
         fetch_content(t)
           .then(format_content)
-          .tap((c) => compile_entries.bind(@)(t, c))
-          .then((c) -> m[t.name] = c)
-          .yield(m)
-      , {}
+          .then((c) -> t.content = c)
+          .yield(t)
 
     ###*
      * Fetch entries for a single content type object

    constructor: (@roots) ->
      @util = new RootsUtil(@roots)
      @roots.config.locals ?= {}

    setup: ->
      configure_content(opts.content_types)
        .then(get_all_content.bind(@))
        .then (res) => @roots.config.locals.contentful = res

    ###*
     * Configures content types set in app.coffee. Sets default values if

      _.assign(_.omit(e, 'fields'), e.fields)

    ###*
     * Builds locals object from types objects with content
     * @param {Array} types - populated content type objects
     * @return {Promise} - promise for when complete
    ###

    set_locals = (types) ->
      W.map types, (t) => @roots.config.locals.contentful[t.name] = t.content

    ###*
     * Compiles single entry views for content types
     * @param {Array} types - Populated content type objects
     * @return {Promise} - promise for when compilation is finished
    ###

    compile_entries = (types) ->
      W.map types, (t) =>
        if not t.template then return W.resolve()
        W.map t.content, (entry) =>
          locals = _.merge(@roots.config.locals, entry: entry)
          jade.renderFile(path.join(@roots.root, t.template), locals)
            .then((res) => @util.write("#{t.path(entry)}.html", res))

