code: @Override
  	public Iterator<FeatureDescriptor> getFeatureDescriptors(final ELContext context, final Object base) {
  		return new Iterator<FeatureDescriptor>() {
  			Iterator<FeatureDescriptor> empty = Collections.<FeatureDescriptor> emptyList().iterator();
  			Iterator<ELResolver> resolvers = CompositeELResolver.this.resolvers.iterator();
  			Iterator<FeatureDescriptor> features = empty;
  
  			Iterator<FeatureDescriptor> features() {
  				while (!features.hasNext() && resolvers.hasNext()) {
  					features = resolvers.next().getFeatureDescriptors(context, base);
  					if (features == null) {
  						features = empty;
  					}
  				}
  				return features;
  			}
  
  			public boolean hasNext() {
  				return features().hasNext();
  			}
  
  			public FeatureDescriptor next() {
  				return features().next();
  			}
  
  			public void remove() {
  				features().remove();
  			}
  		};
  	}
docs: Returns information about the set of variables or properties that can be resolved for the
  given base object. One use for this method is to assist tools in auto-completion. The results
  are collected from all component resolvers. The propertyResolved property of the ELContext is
  not relevant to this method. The results of all ELResolvers are concatenated. The Iterator
  returned is an iterator over the collection of FeatureDescriptor objects returned by the
  iterators returned by each component resolver's getFeatureDescriptors method. If null is
  returned by a resolver, it is skipped.
  
  @param context
  The context of this evaluation.
  @param base
  The base object to return the most general property type for, or null to enumerate
  the set of top-level variables that this resolver can evaluate.
  @return An Iterator containing zero or more (possibly infinitely more) FeatureDescriptor
  objects, or null if this resolver does not handle the given base object or that the
  results are too complex to represent with this method