docs: @SuppressWarnings("unused")
      public Method getOrigin(Object instance, String methodWithTypeAndSignature) throws Throwable {
          if (!isMocked(instance)) {
              return null;
          }
  
          Matcher methodComponents = methodPattern.matcher(methodWithTypeAndSignature);
          boolean wasFound = methodComponents.find();
          if (!wasFound) {
              throw new IllegalArgumentException();
          }
          String argTypeNames[] = methodComponents.group(3).split(",");
  
          ArrayList<Class<?>> argTypes = new ArrayList<>(argTypeNames.length);
          for (String argTypeName : argTypeNames) {
              if (!argTypeName.equals("")) {
                  switch (argTypeName) {
                      case "byte":
                          argTypes.add(Byte.TYPE);
                          break;
                      case "short":
                          argTypes.add(Short.TYPE);
                          break;
                      case "int":
                          argTypes.add(Integer.TYPE);
                          break;
                      case "long":
                          argTypes.add(Long.TYPE);
                          break;
                      case "char":
                          argTypes.add(Character.TYPE);
                          break;
                      case "float":
                          argTypes.add(Float.TYPE);
                          break;
                      case "double":
                          argTypes.add(Double.TYPE);
                          break;
                      case "boolean":
                          argTypes.add(Boolean.TYPE);
                          break;
                      case "byte[]":
                          argTypes.add(byte[].class);
                          break;
                      case "short[]":
                          argTypes.add(short[].class);
                          break;
                      case "int[]":
                          argTypes.add(int[].class);
                          break;
                      case "long[]":
                          argTypes.add(long[].class);
                          break;
                      case "char[]":
                          argTypes.add(char[].class);
                          break;
                      case "float[]":
                          argTypes.add(float[].class);
                          break;
                      case "double[]":
                          argTypes.add(double[].class);
                          break;
                      case "boolean[]":
                          argTypes.add(boolean[].class);
                          break;
                      default:
                          if (argTypeName.endsWith("[]")) {
                              argTypes.add(Class.forName("[L" + argTypeName.substring(0,
                                      argTypeName.length() - 2) + ";"));
                          } else {
                              argTypes.add(Class.forName(argTypeName));
                          }
                          break;
                  }
              }
          }
  
          Method origin = Class.forName(methodComponents.group(1)).getDeclaredMethod(
                  methodComponents.group(2), argTypes.toArray(new Class<?>[]{}));
  
          if (isOverridden(instance, origin)) {
              return null;
          } else {
              return origin;
          }
      }