docs: public void retrieveReference(Object obj, ClassDescriptor cld, ObjectReferenceDescriptor rds, boolean forced)
      {
          PersistentField refField;
          Object refObj = null;
          
          if (forced || rds.getCascadeRetrieve())
          {
              pb.getInternalCache().enableMaterializationCache();
              try
              {
                  Identity id = getReferencedObjectIdentity(obj, rds, cld);
                  boolean isRefObjDefined = true;
  
                  if (id == null)
                  {
                      refObj = null;
                  } //JMM : why not see if the object has already been loaded
                  else if ( pb.serviceObjectCache().lookup(id) != null )
                  {
                      refObj = pb.doGetObjectByIdentity(id);
                      if (rds.isSuperReferenceDescriptor()) 
                      {
                          // walk the super-references
                          ClassDescriptor superCld = cld.getRepository().getDescriptorFor(rds.getItemClass());
                          retrieveReferences(refObj, superCld, false);
                          retrieveCollections(refObj, superCld, false);                        
                      }
                  }
                  else if ((m_retrievalTasks != null)
                          && !rds.isLazy()
                          && (rds.getItemProxyClass() == null))
                  {
                      addRetrievalTask(obj, rds);
                      isRefObjDefined = false;
                  }
                  else
                  {
                      refObj = getReferencedObject(id, rds);
                  }
  
                  if (isRefObjDefined)
                  {
                      refField = rds.getPersistentField();
                      refField.set(obj, refObj);
  
                      if ((refObj != null) && prefetchProxies
                              && (m_retrievalTasks != null)
                              && (rds.getProxyPrefetchingLimit() > 0))
                      {
                          IndirectionHandler handler = ProxyHelper.getIndirectionHandler(refObj);
  
                          if ((handler != null)
                                  && addRetrievalTask(obj, rds))
                          {
                              new PBMaterializationListener(obj, m_retrievalTasks,
                                      rds, rds.getProxyPrefetchingLimit());
                          }
                      }
                  }
  
                  pb.getInternalCache().disableMaterializationCache();
              }
              catch(RuntimeException e)
              {
                  pb.getInternalCache().doLocalClear();
                  throw e;
              }
          }
      }