docs: @Override
  	public Iterator<FeatureDescriptor> getFeatureDescriptors(ELContext context, Object base) {
  		if (isResolvable(base)) {
  			final PropertyDescriptor[] properties;
  			try {
  				properties = Introspector.getBeanInfo(base.getClass()).getPropertyDescriptors();
  			} catch (IntrospectionException e) {
  				return Collections.<FeatureDescriptor> emptyList().iterator();
  			}
  			return new Iterator<FeatureDescriptor>() {
  				int next = 0;
  
  				public boolean hasNext() {
  					return properties != null && next < properties.length;
  				}
  
  				public FeatureDescriptor next() {
  					PropertyDescriptor property = properties[next++];
  					FeatureDescriptor feature = new FeatureDescriptor();
  					feature.setDisplayName(property.getDisplayName());
  					feature.setName(property.getName());
  					feature.setShortDescription(property.getShortDescription());
  					feature.setExpert(property.isExpert());
  					feature.setHidden(property.isHidden());
  					feature.setPreferred(property.isPreferred());
  					feature.setValue(TYPE, property.getPropertyType());
  					feature.setValue(RESOLVABLE_AT_DESIGN_TIME, true);
  					return feature;
  				}
  
  				public void remove() {
  					throw new UnsupportedOperationException("cannot remove");
  				}
  			};
  		}
  		return null;
  	}