code: function() {
        var injectionSites = _.result(this, 'injectionSites');
        _.each(injectionSites, function(config, injectionSiteName) {
          if (!this.get('hide:' + injectionSiteName)) {
            var options = {};
            var trackedView;
            if (_.isFunction(config)) {
              config = config.call(this);
            }
            if (config instanceof Backbone.View) {
              trackedView = config;
            } else if (_.isObject(config)) {
              options = config.options;
              config = config.view;
            }
            if (!trackedView) {
              if (_.isString(config)) {
                trackedView = _.result(this, config);
              } else if (config instanceof Backbone.View) {
                trackedView = config;
              } else if (_.isFunction(config)) {
                trackedView = config.call(this);
              }
            }
            if (trackedView) {
              this.attachView(injectionSiteName, trackedView, options);
            }
          }
        }, this);
      }
docs: ************** Private methods **************// 
  Attaches views using this.injectionSites. The API for injectionSites looks like:
  injectionSites: {
  foo: fooView,  // foo is injectionSite, fooView is the view
  bar: 'barView',  // bar is injectionSite, 'barView' is a field on the view (view.barView)
  baz: function() {  // baz is injectionSite
  return this.bazView;  // the context 'this' is the view
  },
  taz: {  // if you want to pass in options, use a config object with 'view' and 'options'
  view: (same as the three above: direct reference, string of view field, or function that return view),
  options: {} // optional options
  }
  }
  To create dynamic show/hide logic, perform the logic in a function that returns the correct view, or you can
  call this.set('hide:foo', true) or this.set('hide:foo', false)
  @private
  @method __attachViewsFromInjectionSites