code: public Iterator<FeatureDescriptor> getFeatureDescriptors(
                                            ELContext context,
                                            Object base) {
          if (base == null){
              return null;
          }
  
          BeanInfo info = null;
          try {
              info = Introspector.getBeanInfo(base.getClass());
          } catch (Exception ex) {
          }
          if (info == null) {
              return null;
          }
          ArrayList<FeatureDescriptor> list = new ArrayList<FeatureDescriptor>(
                  info.getPropertyDescriptors().length);
          for (PropertyDescriptor pd: info.getPropertyDescriptors()) {
              pd.setValue("type", pd.getPropertyType());
              pd.setValue("resolvableAtDesignTime", Boolean.TRUE);
              list.add(pd);
          }
          return list.iterator();
      }
docs: If the base object is not <code>null</code>, returns an
  <code>Iterator</code> containing the set of JavaBeans properties
  available on the given object. Otherwise, returns <code>null</code>.
  
  <p>The <code>Iterator</code> returned must contain zero or more
  instances of {@link java.beans.FeatureDescriptor}. Each info object
  contains information about a property in the bean, as obtained by
  calling the <code>BeanInfo.getPropertyDescriptors</code> method.
  The <code>FeatureDescriptor</code> is initialized using the same
  fields as are present in the <code>PropertyDescriptor</code>,
  with the additional required named attributes "<code>type</code>" and
  "<code>resolvableAtDesignTime</code>" set as follows:
  <dl>
  <li>{@link ELResolver#TYPE} - The runtime type of the property, from
  <code>PropertyDescriptor.getPropertyType()</code>.</li>
  <li>{@link ELResolver#RESOLVABLE_AT_DESIGN_TIME} - <code>true</code>.</li>
  </dl>
  </p>
  
  @param context The context of this evaluation.
  @param base The bean to analyze.
  @return An <code>Iterator</code> containing zero or more
  <code>FeatureDescriptor</code> objects, each representing a property
  on this bean, or <code>null</code> if the <code>base</code>
  object is <code>null</code>.