code: function() {
        var firstItemView, sameOrder,
          elements = [],
          models = this.modelsToRender(),
          newOrderOfIds = _.pluck(models, this.__modelId),
          sizeOfNewModels = _.size(newOrderOfIds),
          sizeOfOldModels = _.size(this.__orderedModelIdList),
          sameSize = sizeOfNewModels === sizeOfOldModels;
  
        if (sameSize) {
          // is order the same?
          sameOrder = _.reduce(this.__orderedModelIdList, function(result, oldId, index) {
            return result && newOrderOfIds[index] == oldId;
          }, true);
        } else {
          throw 'Reorder should not be invoked if the number of models have changed';
        }
        if (!sizeOfNewModels || sameOrder) {
          // stop early if there are no models to reorder or the models are the same
          return;
        }
        _.each(models, function(model, index) {
          var itemView = this.getItemViewFromModel(model);
          if (itemView) {
            elements.push(itemView.$el);
          }
          if (index === 0) {
            firstItemView = itemView;
          }
        }, this);
        // elements that are already connected to the DOM will be moved instead of re-attached
        // meaning that detach, delegate events, and attach are not needed
        if (!this.itemContainer) {
          this.$el.append(elements);
        } else if (firstItemView) {
          var injectionSite = $("<span>");
          firstItemView.$el.before(injectionSite);
          injectionSite.after(elements);
          injectionSite.remove();
        }
        this.__updateOrderedModelIdList(newOrderOfIds);
        this.trigger('reorder-complete');
      }
docs: Takes existing item views and moves them into correct order defined by
  this.modelsToRender(). NOTE: As this method doesn't generate or remove views,
  this method takes advantage of jquery's ability to move elements already attached to the DOM.
  @method reorder