public static <F,T> Adapter<F,T> getAdapter(Class<F> fromType,
         Class<T> toType) throws AdapterNotFoundException {
      if(fromType == null || toType == null) {
         throw getException(fromType, toType);
      }

      //If the types passed in are primitive, convert to wrapped types to find
      //the appropriate adapter
      fromType = getWrapper(fromType);
      toType = getWrapper(toType);

      if(fromType.equals(toType)) {
         return sSameTypeAdapter;
      }

      Adapter<F,T> adapter = (Adapter<F,T>)sAdapters.get(
            new ClassPair<F,T>(fromType, toType));
      if(adapter == null) {
         //No adapter found...check some special cases

         //If either type is an enum then check for the generic enum case
         Class f = fromType.isEnum() ? Enum.class : fromType;
         Class t = toType.isEnum() ? Enum.class : toType;

         adapter = (Adapter<F,T>)sAdapters.get(new ClassPair<F,T>(f, t));
         if(adapter == null) {
            throw getException(fromType, toType);
         }
      }

      return adapter;
   }