protected static function findReference($refRef, EarthIT_Schema_ResourceClass $rc, EarthIT_Schema $schema = null, &$refName = null, &$refIsPlural = null, $fuzzyMatch = true)
 {
     $refRef = self::maybeMinimize($refRef, $fuzzyMatch);
     $refs = $rc->getReferences();
     if ($fuzzyMatch) {
         foreach ($refs as $k => $ref) {
             if (EarthIT_Schema_WordUtil::minimize($k) == $refRef) {
                 $refName = $k;
                 $refIsPlural = false;
                 return $ref;
             }
         }
     } else {
         if (isset($refs[$refRef])) {
             $refIsPlural = false;
             $refName = $refRef;
             return $refs[$refName];
         }
     }
     if ($schema !== null) {
         $rcs = $schema->getResourceClasses();
         // Look for one based on explicit inverse name
         foreach ($rcs as $trcName => $trc) {
             foreach ($rc->getReferences() as $ref) {
                 $refInverseName = $ref->getFirstPropertyValue(EarthIT_CMIPREST_NS::INVERSE_NAME);
                 $refPluralInverseName = $ref->getFirstPropertyValue(EarthIT_CMIPREST_NS::INVERSE_COLLECTION_NAME, EarthIT_Schema_WordUtil::pluralize($refInverseName));
                 $matchRefInverseName = self::maybeMinimize($refInverseName, $fuzzyMatch);
                 $matchRefPluralInverseName = self::maybeMinimize($refPluralInverseName, $fuzzyMatch);
                 // plural takes priority if plural name = singular name
                 if ($matchRefPluralInverseName == $refRef) {
                     $refName = $refPluralInverseName;
                     $refIsPlural = true;
                     return new EarthIT_Schema_Reference($trcName, $ref->getTargetFieldNames(), $ref->getOriginFieldNames());
                 }
                 if ($matchRefInverseName == $refRef) {
                     $refName = $refInverseName;
                     $refIsPlural = false;
                     return new EarthIT_Schema_Reference($trcName, $ref->getTargetFieldNames(), $ref->getOriginFieldNames());
                 }
             }
         }
         // Look for one based on class name = ref ref
         foreach ($rcs as $trcName => $trc) {
             $trcCollectionName = $trc->getFirstPropertyValue(self::COLLECTION_NAME, EarthIT_Schema_WordUtil::pluralize($trcName));
             $matchTrcCollectionName = self::maybeMinimize($trcCollectionName, $fuzzyMatch);
             $matchTrcName = self::maybeMinimize($trcName, $fuzzyMatch);
             $found = false;
             // plural takes priority if plural name = singular name
             if ($matchTrcCollectionName == $refRef) {
                 $found = true;
                 $refIsPlural = true;
                 $refName = $trcCollectionName;
             } else {
                 if ($matchTrcName == $refRef) {
                     $found = true;
                     $refIsPlural = false;
                     $refName = $trcName;
                 }
             }
             if ($found) {
                 // Found a resource class that could work
                 // if it has an appropriate reverse reference.
                 foreach ($trc->getReferences() as $ref) {
                     if ($ref->getTargetClassName() == $rc->getName()) {
                         return new EarthIT_Schema_Reference($trcName, $ref->getTargetFieldNames(), $ref->getOriginFieldNames());
                     }
                 }
             }
         }
     }
     return null;
 }