docs: function(features, options) {
          if(!features || features.length === 0) {
              return;
          }
          if (features === this.features) {
              return this.removeAllFeatures(options);
          }
          if (!(OpenLayers.Util.isArray(features))) {
              features = [features];
          }
          if (features === this.selectedFeatures) {
              features = features.slice();
          }
  
          var notify = !options || !options.silent;
          
          if (notify) {
              this.events.triggerEvent(
                  "beforefeaturesremoved", {features: features}
              );
          }
  
          for (var i = features.length - 1; i >= 0; i--) {
              // We remain locked so long as we're not at 0
              // and the 'next' feature has a geometry. We do the geometry check
              // because if all the features after the current one are 'null', we
              // won't call eraseGeometry, so we break the 'renderer functions
              // will always be called with locked=false *last*' rule. The end result
              // is a possible gratiutious unlocking to save a loop through the rest 
              // of the list checking the remaining features every time. So long as
              // null geoms are rare, this is probably okay.    
              if (i != 0 && features[i-1].geometry) {
                  this.renderer.locked = true;
              } else {
                  this.renderer.locked = false;
              }
      
              var feature = features[i];
              delete this.unrenderedFeatures[feature.id];
  
              if (notify) {
                  this.events.triggerEvent("beforefeatureremoved", {
                      feature: feature
                  });
              }
  
              this.features = OpenLayers.Util.removeItem(this.features, feature);
              // feature has no layer at this point
              feature.layer = null;
  
              if (feature.geometry) {
                  this.renderer.eraseFeatures(feature);
              }
                      
              //in the case that this feature is one of the selected features, 
              // remove it from that array as well.
              if (OpenLayers.Util.indexOf(this.selectedFeatures, feature) != -1){
                  OpenLayers.Util.removeItem(this.selectedFeatures, feature);
              }
  
              if (notify) {
                  this.events.triggerEvent("featureremoved", {
                      feature: feature
                  });
              }
          }
  
          if (notify) {
              this.events.triggerEvent("featuresremoved", {features: features});
          }
      }