public <V> Adapter.Setter<V> makeSetter(String methodName, Class<V> _class) {
    try {
      final Method method = version.getClass().getMethod(methodName, _class);
     
      return new Adapter.Setter<V>() {
        public void call(V value) {
          try {
            Transaction me  = Thread.getTransaction();
            Transaction other = null;
            Set<Transaction> others = null;
                 	 
            while (true) {
              synchronized (Adapter.this) {
                others = readWriteConflict(me);
                if (others == null) {
                  other = openWrite(me);
                  if (other == null) {
                	  
                	
                    method.invoke(version, value);  
                   
                    return;
                  }
                }
              }
              if (others != null) {             
                manager.resolveConflict(me, others);
              } else if (other != null) {
                manager.resolveConflict(me, other);
              }
          
            }
          } catch (IllegalAccessException e) {
            throw new PanicException(e);
          } catch (InvocationTargetException e) {
            throw new PanicException(e);
          }
        }};
    } catch (NoSuchMethodException e) {
      throw new PanicException(e);
    }
  }