code: function(whereProperties, whereValue, whereEquals, out, delaySort)
    {
      var where = createWhere( whereProperties, whereValue, whereEquals );
      var removed = out || this.cloneEmpty();
      var removedIndices = [];
  
      for (var i = 0; i < this.length; i++)
      {
        var value = this[ i ];
  
        if ( where( value ) )
        {
          removedIndices.push( i );
          removed.push( value );
        }
      }
  
      for (var i = removedIndices.length - 1; i >= 0; i--)
      {
        AP.splice.call( this, removedIndices[ i ], 1 );
      }
  
      this.trigger( Collection.Events.Removes, [this, removed, removedIndices] );
  
      if ( !delaySort )
      {
        this.sort( undefined, undefined, true );
      }
  
      return removed;
    }
docs: Removes elements from this collection that meet the specified criteria. The
  given criteria are passed to {@link Rekord.createWhere} to create a filter
  function. All elements removed are returned
  
  ```javascript
  var isEven = function(x) { return x % 2 === 0; };
  var c = Rekord.collect(1, 2, 3, 4);
  c.removeWhere( isEven ); // [2, 4];
  c // [1, 3]
  ```
  
  @method
  @memberof Rekord.Collection#
  @param {whereInput} [whereProperties] -
  See {@link Rekord.createWhere}
  @param {Any} [whereValue] -
  See {@link Rekord.createWhere}
  @param {equalityCallback} [whereEquals] -
  See {@link Rekord.createWhere}
  @param {Array} [out=this.cloneEmpty()] -
  The array to place the elements that match.
  @param {Boolean} [delaySort=false] -
  Whether automatic sorting should be delayed until the user manually
  calls {@link Rekord.Collection#sort sort}.
  @return {Rekord.Collection} -
  The reference to this collection.
  @emits Rekord.Collection#removes
  @emits Rekord.Collection#sort
  @see Rekord.createWhere