@Override
      public Object invokeMethod(final JavaMethod method, final Object proxy, final Object[] args, final List<?> implementations) {
        @NonNls String methodName = method.getName();
        if ("toString".equals(methodName)) {
          return "Merger: " + implementations;
        }
        if ("hashCode".equals(methodName)) {
          int result = 1;

          for (Object element : implementations) {
            result = 31 * result + element.hashCode();
          }

          return result;
        }
        if ("equals".equals(methodName)) {
          final Object arg = args[0];
          return arg instanceof MergedObject && implementations.equals(((MergedObject)arg).getImplementations());
        }
        return null;
      }
@Override
      public Object invokeMethod(final JavaMethod method, final Object proxy, final Object[] args, final List<?> implementations)