/**
  * Returns a non-null copy of the Set of objects the character qualifies for in this
  * AbstractQualifiedListFacet for the Player Character represented by the given CharID and the
  * given source. This method returns an empty set if the Player Character identified by the given
  * CharID qualifies for none of the objects in this AbstractQualifiedListFacet granted by the
  * given source.
  *
  * <p>This method is value-semantic in that ownership of the returned List is transferred to the
  * class calling this method. Modification of the returned List will not modify this
  * AbstractQualifiedListFacet and modification of this AbstractQualifiedListFacet will not modify
  * the returned List. Modifications to the returned List will also not modify any future or
  * previous objects returned by this (or other) methods on AbstractQualifiedListFacet. If you wish
  * to modify the information stored in this AbstractQualifiedListFacet, you must use the add*()
  * and remove*() methods of AbstractQualifiedListFacet.
  *
  * <p>Generally, use of this method is discouraged in general operational aspects. However, it is
  * recognized that certain output tokens can list certain items by source, and thus this method is
  * required, and it is unreasonable to expect complete elimination of this method or entirely
  * prohibit future use of this method.
  *
  * @param id The CharID representing the Player Character for which the items in this
  *     AbstractQualifiedListFacet should be returned.
  * @param source The source object for which a copy of the List of objects the Player Character
  *     qualifies for should be returned.
  * @return A non-null Set of objects the Player Character represented by the given CharID
  *     qualifies for in this AbstractQualifiedListFacet
  */
 public Collection<T> getQualifiedSet(CharID id, Object source) {
   Set<T> set = new WrappedMapSet<T>(IdentityHashMap.class);
   Map<T, Set<Object>> componentMap = getCachedMap(id);
   if (componentMap != null) {
     for (Map.Entry<T, Set<Object>> me : componentMap.entrySet()) {
       T obj = me.getKey();
       Set<Object> sources = me.getValue();
       if (sources.contains(source)) {
         if (prereqFacet.qualifies(id, obj, source)) {
           set.add(obj);
         }
       }
     }
   }
   return set;
 }
 /**
  * Acts on the Set of objects the character qualifies for in this AbstractQualifiedListFacet for
  * the Player Character represented by the given CharID. The results of each action as provided by
  * the given QualifiedActor are returned in a non-null List.
  *
  * <p>This method returns an empty List if the Player Character identified by the given CharID
  * qualifies for none of the objects in this AbstractQualifiedListFacet.
  *
  * <p>This method is value-semantic in that ownership of the returned List is transferred to the
  * class calling this method. Modification of the returned List will not modify this
  * AbstractQualifiedListFacet and modification of this AbstractQualifiedListFacet will not modify
  * the returned List. Modifications to the returned List will also not modify any future or
  * previous objects returned by this (or other) methods on AbstractQualifiedListFacet. If you wish
  * to modify the information stored in this AbstractQualifiedListFacet, you must use the add*()
  * and remove*() methods of AbstractQualifiedListFacet.
  *
  * <p>Note: If a particular item has been granted by more than one source, then the QualifiedActor
  * will only be called for the first source that (successfully grants) the underlying object.
  *
  * @param id The CharID representing the Player Character for which the items in this
  *     AbstractQualifiedListFacet should be returned.
  * @param qa The QualifiedActor which will act on each of the items in this
  *     AbstractQualifiedListFacet for which the Player Character qualifies.
  * @return A non-null List of objects created by the QualifiedActor from each of the objects in
  *     this AbstractQualifiedListFacet for which the Player Character qualifies.
  */
 public <R> List<R> actOnQualifiedSet(CharID id, QualifiedActor<T, R> qa) {
   List<R> list = new ArrayList<R>();
   Map<T, Set<Object>> componentMap = getCachedMap(id);
   if (componentMap != null) {
     for (Map.Entry<T, Set<Object>> me : componentMap.entrySet()) {
       T obj = me.getKey();
       Set<Object> sources = me.getValue();
       for (Object source : sources) {
         if (prereqFacet.qualifies(id, obj, source)) {
           list.add(qa.act(obj, source));
         }
       }
     }
   }
   return list;
 }
 /**
  * Returns a non-null copy of the Set of objects the character qualifies for in this
  * AbstractQualifiedListFacet for the Player Character represented by the given CharID. This
  * method returns an empty set if the Player Character identified by the given CharID qualifies
  * for none of the objects in this AbstractQualifiedListFacet.
  *
  * <p>This method is value-semantic in that ownership of the returned Collection is transferred to
  * the class calling this method. Modification of the returned Collection will not modify this
  * AbstractQualifiedListFacet and modification of this AbstractQualifiedListFacet will not modify
  * the returned Collection. Modifications to the returned Collection will also not modify any
  * future or previous objects returned by this (or other) methods on AbstractQualifiedListFacet.
  * If you wish to modify the information stored in this AbstractQualifiedListFacet, you must use
  * the add*() and remove*() methods of AbstractQualifiedListFacet.
  *
  * @param id The CharID representing the Player Character for which the items in this
  *     AbstractQualifiedListFacet should be returned.
  * @return A non-null Set of objects the Player Character represented by the given CharID
  *     qualifies for in this AbstractQualifiedListFacet
  */
 public Collection<T> getQualifiedSet(CharID id) {
   Set<T> set = new HashSet<T>();
   Map<T, Set<Object>> componentMap = getCachedMap(id);
   if (componentMap != null) {
     for (Map.Entry<T, Set<Object>> me : componentMap.entrySet()) {
       T obj = me.getKey();
       Set<Object> sources = me.getValue();
       for (Object source : sources) {
         if (prereqFacet.qualifies(id, obj, source)) {
           set.add(obj);
           break;
         }
       }
     }
   }
   return set;
 }