public static synchronized Pair<List<Pair<Function, String>>, Set<String>>
      getMethodsAndTheirSignatures(Class<?> originalLib) {
    if (cachedForcedMethodsAndTheirSignatures == null)
      cachedForcedMethodsAndTheirSignatures =
          new HashMap<Class<?>, Pair<List<Pair<Function, String>>, Set<String>>>();

    Pair<List<Pair<Function, String>>, Set<String>> pair =
        cachedForcedMethodsAndTheirSignatures.get(originalLib);
    if (pair == null) {
      pair =
          new Pair<List<Pair<Function, String>>, Set<String>>(
              new ArrayList<Pair<Function, String>>(), new HashSet<String>());
      for (Method m : originalLib.getDeclaredMethods()) {
        Function f = Function.fromMethod(m);
        String sig = f.computeSignature(Function.SignatureType.JavaStyle);
        // if (m.getDeclaringClass().equals(NSObject.class) && f.getName().equals("as")) {
        //	Declaration
        // }
        pair.getFirst().add(new Pair<Function, String>(f, sig));
        pair.getSecond().add(sig);
      }
    }
    return pair;
  }