public <V> Adapter.Getter<V> makeGetter(String methodName, Class<V> _class)  {
    try {
      T version = (T) start.get().newVersion;
      final Method method = version.getClass().getMethod(methodName);
      return new Adapter.Getter<V>() {
        public V call() {
          try {
            Transaction me = Thread.getTransaction();
            Locator oldLocator = Adapter.this.start.get();
            T version = (T) oldLocator.fastPath(me);
            if (version == null) {
              ContentionManager manager = Thread.getContentionManager();
              version = (T) oldLocator.getVersion(me, manager);
              LocalReadSet.getLocal().add(Adapter.this, oldLocator);
              if (!me.isActive()) {
                throw new AbortedException();
              }
            }
            return (V)method.invoke(version);
          } catch (SecurityException e) {
            throw new PanicException(e);
          } catch (IllegalAccessException e) {
            throw new PanicException(e);
          } catch (InvocationTargetException e) {
            throw new PanicException(e);
          }
        }};
    } catch (NoSuchMethodException e) {
      throw new PanicException(e);
    }
  }