code: public static Map<String, PropertyDescriptor>
      getAllProperties(GenericType root)
          throws IntrospectionException {
  
          Map<String, PropertyDescriptor> properties =
              cPropertiesCache.get(root);
          if (properties == null) {
              GenericType rootType = root.getRootType();
              if (rootType == null) {
                  rootType = root;
              }
              properties = Collections.unmodifiableMap
              (
                  createProperties(rootType, root)
              );
              cPropertiesCache.put(root, properties);
          }
  
          return properties;
      }
docs: A function that returns a Map of all the available properties on
  a given class including write-only properties. The properties returned
  is mostly a superset of those returned from the standard JavaBeans
  Introspector except pure indexed properties are discarded.
  
  <p>Interfaces receive all the properties available in Object. Arrays,
  Strings and Collections all receive a "length" property. An array's
  "length" PropertyDescriptor has no read or write methods.
  
  <p>Instead of indexed properties, there may be keyed properties in the
  map, represented by a {@link KeyedPropertyDescriptor}. Arrays, Strings
  and Lists always have keyed properties with a key type of int.
  
  <p>Because the value returned from a keyed property method may be more
  specific than the method signature describes (such is often the case
  with collections), a bean class can contain a special field that
  indicates what that specific type should be. The signature of this field
  is as follows:
  <tt>public&nbsp;static&nbsp;final&nbsp;Class&nbsp;ELEMENT_TYPE&nbsp;=&nbsp;&lt;type&gt;.class;</tt>.
  
  @return an unmodifiable mapping of property names (Strings) to
  PropertyDescriptor objects.