Irrespective of the return type, all RF methods now go through the valueStore.
Added a bunch of missing @Override annotations, removed an unused method in
DeltaValueStoreJsonImpl, Confirmed that instance methods work, have side
effects, and the sync results returned are meaningful.

Patch by: amitmanjhi
Review by: cromwellian, rjrjr (TBR)


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@8580 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigDecimalRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigDecimalRequest.java
index 1f82e1a..699e655 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigDecimalRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigDecimalRequest.java
@@ -15,11 +15,10 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
 import java.math.BigDecimal;
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -38,10 +37,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(new BigDecimal(responseText),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(new BigDecimal(responseText), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigIntegerRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigIntegerRequest.java
index 8bfd778..7a20d17 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigIntegerRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractBigIntegerRequest.java
@@ -15,12 +15,11 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -39,10 +38,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(new BigDecimal(responseText).toBigInteger(),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(new BigDecimal(responseText).toBigInteger(), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractBooleanRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractBooleanRequest.java
index 29c39dc..2ad281e 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractBooleanRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractBooleanRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -37,10 +36,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(Boolean.valueOf(responseText),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(Boolean.valueOf(responseText), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractByteRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractByteRequest.java
index e1b0f46..b2092c6 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractByteRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractByteRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -37,10 +36,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(Integer.valueOf(responseText).byteValue(),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(Integer.valueOf(responseText).byteValue(), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractCharacterRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractCharacterRequest.java
index 4ed98fe..89abf70 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractCharacterRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractCharacterRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -37,10 +36,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(responseText.charAt(0), 
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(responseText.charAt(0), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractDateRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractDateRequest.java
index d87264c..d37f07c 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractDateRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractDateRequest.java
@@ -15,11 +15,10 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
 import java.util.Date;
+import java.util.Set;
 
 /**
  * <p>
@@ -38,10 +37,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(new Date(Long.valueOf(responseText)),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(new Date(Long.valueOf(responseText)), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractDoubleRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractDoubleRequest.java
index 52deeef..7732d0c 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractDoubleRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractDoubleRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -37,10 +36,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(Double.valueOf(responseText),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(Double.valueOf(responseText), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractEnumRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractEnumRequest.java
index f25c997..443b483 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractEnumRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractEnumRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -42,13 +41,13 @@
     this.enumValues = enumValues;
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
+      Set<SyncResult> syncResults) {
     int ordinal = Integer.valueOf(responseText);
     for (E e : enumValues) {
       if (ordinal == e.ordinal()) {
-        receiver.onSuccess(ordinal,
-            Collections.<SyncResult> emptySet());
+        receiver.onSuccess(ordinal, syncResults);
       }
     }
     throw new IllegalArgumentException("Invalid enum ordinal value " + ordinal);
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractFloatRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractFloatRequest.java
index a082a035..c0f061f 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractFloatRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractFloatRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -37,10 +36,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(Float.valueOf(responseText),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(Float.valueOf(responseText), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractIntegerRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractIntegerRequest.java
index fa091c4..de68a2d 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractIntegerRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractIntegerRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -37,10 +36,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(Integer.valueOf(responseText),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(Integer.valueOf(responseText), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonListRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonListRequest.java
index 3880847..995a07f 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonListRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonListRequest.java
@@ -15,15 +15,14 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.JsArray;
 import com.google.gwt.requestfactory.shared.RecordListRequest;
 import com.google.gwt.valuestore.shared.Record;
 import com.google.gwt.valuestore.shared.SyncResult;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 
 /**
  * <p>
@@ -50,7 +49,8 @@
     this.schema = schema;
   }
 
-  public void handleResult(Object jsoResult, JavaScriptObject sideEffects) {
+  @Override
+  public void handleResult(Object jsoResult, Set<SyncResult> syncResults) {
 
     JsArray<RecordJsoImpl> valueJsos = (JsArray<RecordJsoImpl>) jsoResult;
     List<T> valueList = new ArrayList<T>(valueJsos.length());
@@ -62,6 +62,6 @@
 
     requestFactory.getValueStore().setRecords(valueJsos, requestFactory);
 
-    receiver.onSuccess(valueList, Collections.<SyncResult> emptySet());
+    receiver.onSuccess(valueList, syncResults);
   }
 }
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonObjectRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonObjectRequest.java
index 7f9cc2b..e4d8cdf 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonObjectRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonObjectRequest.java
@@ -15,12 +15,11 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.requestfactory.shared.RecordRequest;
 import com.google.gwt.valuestore.shared.Record;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p> <span style="color:red">Experimental API: This class is still under rapid
@@ -44,14 +43,15 @@
     this.schema = schema;
   }
 
-  public void handleResult(Object jsoResult, JavaScriptObject sideEffects) {
+  @Override
+  public void handleResult(Object jsoResult, Set<SyncResult> syncResults) {
 
     RecordJsoImpl jso = (RecordJsoImpl) jsoResult;
     jso.setSchema(schema);
 
     requestFactory.getValueStore().setRecord(jso, requestFactory);
 
-    receiver.onSuccess(schema.create(jso), Collections.<SyncResult>emptySet());
+    receiver.onSuccess(schema.create(jso), syncResults);
   }
 
 }
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractLongRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractLongRequest.java
index d72fee2..0314a28 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractLongRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractLongRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -37,10 +36,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(Long.valueOf(responseText),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(Long.valueOf(responseText), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractPrimitiveRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractPrimitiveRequest.java
index 0e797ca..83569e1 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractPrimitiveRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractPrimitiveRequest.java
@@ -15,7 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.valuestore.shared.SyncResult;
+
+import java.util.Set;
 
 /**
  * <p>
@@ -36,10 +38,11 @@
     super(requestFactory);
   }
 
-  public void handleResult(Object result, JavaScriptObject sideEffects) {
-    handlePrimitiveResult(asString(result), sideEffects);
+  @Override
+  public void handleResult(Object result, Set<SyncResult> syncResults) {
+    handlePrimitiveResult(asString(result), syncResults);
   }
 
   protected abstract void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects);
+      Set<SyncResult> syncResults);
 }
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java
index 651b8c9..833fbb1 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java
@@ -20,6 +20,7 @@
 import com.google.gwt.requestfactory.shared.RequestObject;
 import com.google.gwt.valuestore.shared.Property;
 import com.google.gwt.valuestore.shared.Record;
+import com.google.gwt.valuestore.shared.SyncResult;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -95,9 +96,10 @@
   }
 
   public void handleResponseText(String responseText) {
-     RecordJsoImpl.JsonResults results = RecordJsoImpl.fromResults(responseText);
+    RecordJsoImpl.JsonResults results = RecordJsoImpl.fromResults(responseText);
     processRelated(results.getRelated());
-    handleResult(results.getResult(), results.getSideEffects());
+    handleResult(results.getResult(),
+        deltaValueStore.commit(results.getSideEffects()));
   }
   
   public boolean isChanged() {
@@ -128,7 +130,7 @@
   protected abstract R getThis();
 
   protected abstract void handleResult(Object result,
-      JavaScriptObject sideEffects);
+      Set<SyncResult> syncResults);
 
   protected native void processRelated(JavaScriptObject related) /*-{
     for(var recordKey in related) {
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractShortRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractShortRequest.java
index 9450caf..4c8ab1d 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractShortRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractShortRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -37,10 +36,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(Short.valueOf(responseText),
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(Short.valueOf(responseText), syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractStringRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractStringRequest.java
index c15cd1c..4718f78 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractStringRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractStringRequest.java
@@ -15,10 +15,9 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
-import java.util.Collections;
+import java.util.Set;
 
 /**
  * <p>
@@ -37,10 +36,10 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    receiver.onSuccess(responseText,
-        Collections.<SyncResult> emptySet());
+      Set<SyncResult> syncResults) {
+    receiver.onSuccess(responseText, syncResults);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractVoidRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractVoidRequest.java
index 2ac72e9..40a2886 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractVoidRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractVoidRequest.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.valuestore.shared.SyncResult;
 
 import java.util.Set;
@@ -37,9 +36,9 @@
     super(requestFactory);
   }
 
+  @Override
   public void handlePrimitiveResult(String responseText,
-      JavaScriptObject sideEffects) {
-    Set<SyncResult> syncResults = deltaValueStore.commit(sideEffects);
+      Set<SyncResult> syncResults) {
     receiver.onSuccess(null, syncResults);
   }
 
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java b/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java
index 68aca5b..8aec549 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java
@@ -55,12 +55,6 @@
       }
     }-*/;
 
-    private static native JavaScriptObject getJsoResponse(String response) /*-{
-      // TODO: clean and optimize this.
-      eval("xyz=" + response);
-      return xyz["sideEffects"];
-    }-*/;
-
     protected ReturnRecord() {
     }
 
diff --git a/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java b/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
index a530606..f1940fe 100644
--- a/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
+++ b/user/src/com/google/gwt/requestfactory/server/JsonRequestProcessor.java
@@ -697,16 +697,17 @@
     JSONObject envelop = new JSONObject();
     if (result instanceof List<?>) {
       envelop.put(RequestData.RESULT_TOKEN, toJsonArray(operation, result));
-      envelop.put("sideEffects", sideEffects);
+      envelop.put(RequestData.SIDE_EFFECTS_TOKEN, sideEffects);
       return envelop;
     } else if (result instanceof Number || result instanceof Enum
         || result instanceof String || result instanceof Date
         || result instanceof Character || result instanceof Boolean) {
       envelop.put(RequestData.RESULT_TOKEN, result);
+      envelop.put(RequestData.SIDE_EFFECTS_TOKEN, sideEffects);
     } else {
       JSONObject jsonObject = toJsonObject(operation, result);
       envelop.put(RequestData.RESULT_TOKEN, jsonObject);
-      envelop.put("sideEffects", sideEffects);
+      envelop.put(RequestData.SIDE_EFFECTS_TOKEN, sideEffects);
       return envelop;
     }
     envelop.put(RequestData.RELATED_TOKEN, encodeRelatedObjectsToJson());
diff --git a/user/src/com/google/gwt/requestfactory/shared/RequestData.java b/user/src/com/google/gwt/requestfactory/shared/RequestData.java
index b8995cc..15d7421 100644
--- a/user/src/com/google/gwt/requestfactory/shared/RequestData.java
+++ b/user/src/com/google/gwt/requestfactory/shared/RequestData.java
@@ -42,6 +42,8 @@
 
   public static final String RELATED_TOKEN = "related";
 
+  public static final String SIDE_EFFECTS_TOKEN = "sideEffects";
+
   // TODO: non-final is a hack for now.
   private String operation;
   private final Object[] parameters;
diff --git a/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java b/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java
index 1fa3c73..b82f85a 100644
--- a/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java
+++ b/user/test/com/google/gwt/valuestore/client/RequestFactoryTest.java
@@ -20,6 +20,7 @@
 import com.google.gwt.junit.client.GWTTestCase;
 import com.google.gwt.requestfactory.shared.Receiver;
 import com.google.gwt.requestfactory.shared.RequestObject;
+import com.google.gwt.valuestore.shared.Record;
 import com.google.gwt.valuestore.shared.SimpleBarRecord;
 import com.google.gwt.valuestore.shared.SimpleFooRecord;
 import com.google.gwt.valuestore.shared.SimpleRequestFactory;
@@ -142,4 +143,48 @@
           }
         });
   }
+
+  /*
+   * tests that (a) any method can have a side effect that is handled correctly. (b)
+   * instance methods are handled correctly.
+   */
+  public void testMethodWithSideEffects() {
+    final SimpleRequestFactory req = GWT.create(SimpleRequestFactory.class);
+    HandlerManager hm = new HandlerManager(null);
+    req.init(hm);
+    delayTestFinish(5000);
+
+    req.simpleFooRequest().findSimpleFooById(999L).fire(
+        new Receiver<SimpleFooRecord>() {
+
+          public void onSuccess(SimpleFooRecord newFoo,
+              Set<SyncResult> syncResults) {
+            final RequestObject<Long> fooReq = req.simpleFooRequest().countSimpleFooWithUserNameSideEffect(
+                newFoo);
+            newFoo = fooReq.edit(newFoo);
+            newFoo.setUserName("Ray");
+            fooReq.fire(new Receiver<Long>() {
+              public void onSuccess(Long response, Set<SyncResult> syncResults) {
+                assertEquals(new Long(1L), response);
+                // confirm that there was a sideEffect.
+                assertEquals(1, syncResults.size());
+                SyncResult syncResultArray[] = syncResults.toArray(new SyncResult[0]);
+                assertFalse(syncResultArray[0].hasViolations());
+                assertNull(syncResultArray[0].getFutureId());
+                Record record = syncResultArray[0].getRecord();
+                assertEquals(new Long(999L), record.getId());
+                // confirm that the instance method did have the desired sideEffect.
+                req.simpleFooRequest().findSimpleFooById(999L).fire(
+                    new Receiver<SimpleFooRecord>() {
+                      public void onSuccess(SimpleFooRecord finalFoo,
+                          Set<SyncResult> syncResults) {
+                        assertEquals("Ray", finalFoo.getUserName());
+                        finishTest();
+                      }
+                    });
+              }
+            });
+          }
+        });
+  }
 }
diff --git a/user/test/com/google/gwt/valuestore/server/SimpleFoo.java b/user/test/com/google/gwt/valuestore/server/SimpleFoo.java
index d7c6639..52d84ac 100644
--- a/user/test/com/google/gwt/valuestore/server/SimpleFoo.java
+++ b/user/test/com/google/gwt/valuestore/server/SimpleFoo.java
@@ -52,6 +52,11 @@
     return singleton;
   }
 
+  public Long countSimpleFooWithUserNameSideEffect() {
+    singleton.setUserName(userName);
+    return 1L;
+  }
+
   public String hello(SimpleBar bar) {
     return "Greetings " + bar.getUserName() + " from " + getUserName();  
   }
diff --git a/user/test/com/google/gwt/valuestore/shared/SimpleFooRequest.java b/user/test/com/google/gwt/valuestore/shared/SimpleFooRequest.java
index 76ed88f..4ccb524 100644
--- a/user/test/com/google/gwt/valuestore/shared/SimpleFooRequest.java
+++ b/user/test/com/google/gwt/valuestore/shared/SimpleFooRequest.java
@@ -28,6 +28,9 @@
 public interface SimpleFooRequest {
   RequestObject<Long> countSimpleFoo();
 
+  @Instance
+  RequestObject<Long> countSimpleFooWithUserNameSideEffect(SimpleFooRecord record);
+
   RecordListRequest<SimpleFooRecord> findAll();
 
   RecordRequest<SimpleFooRecord> findSimpleFooById(Long id);