Enables setter methods to be directly called on Record/proxy objects, instead of
going through a DeltaValueStore.
Also removes the now unnecessary DeltaValueStore from the public api and deletes the class.

Patch by: amitmanjhi
Review by: rjrjr, cromwellian, robertvawter

Review at http://gwt-code-reviews.appspot.com/752802


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@8516 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/ExpenseDetails.java b/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/ExpenseDetails.java
index a802ca5..ee89c32 100644
--- a/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/ExpenseDetails.java
+++ b/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/ExpenseDetails.java
@@ -39,7 +39,6 @@
 import com.google.gwt.event.logical.shared.CloseHandler;
 import com.google.gwt.i18n.client.DateTimeFormat;
 import com.google.gwt.i18n.client.NumberFormat;
-import com.google.gwt.requestfactory.shared.DeltaValueStore;
 import com.google.gwt.requestfactory.shared.Receiver;
 import com.google.gwt.requestfactory.shared.RequestObject;
 import com.google.gwt.resources.client.ImageResource;
@@ -952,8 +951,8 @@
 
     // Submit the delta.
     RequestObject<Void> editRequest = expensesRequestFactory.reportRequest().persist(report);
-    DeltaValueStore deltas = editRequest.getDeltaValueStore();
-    deltas.set(ReportRecord.notes, report, pendingNotes);
+    ReportRecord editableReport = editRequest.edit(report);
+    editableReport.setNotes(pendingNotes);
     editRequest.fire(new Receiver<Void>() {
           public void onSuccess(Void ignore, Set<SyncResult> response) {
             // We expect onReportChanged to be called if there are no errors.
@@ -1035,10 +1034,10 @@
     }
 
     // Create a delta and sync with the value store.
-    RequestObject<Void> editRequest = expensesRequestFactory.expenseRequest().persist();
-    DeltaValueStore deltas = editRequest.getDeltaValueStore();
-    deltas.set(ExpenseRecord.approval, record, approval);
-    deltas.set(ExpenseRecord.reasonDenied, record, reasonDenied);
+    RequestObject<Void> editRequest = expensesRequestFactory.expenseRequest().persist(record);
+    ExpenseRecord editableRecord = editRequest.edit(record);
+    editableRecord.setApproval(approval);
+    editableRecord.setReasonDenied(reasonDenied);
     editRequest.fire(new Receiver<Void>() {
           public void onSuccess(Void ignore, Set<SyncResult> response) {
             String errorMessage = getErrorMessageFromSync(response);
diff --git a/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/MobileExpenseEntry.java b/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/MobileExpenseEntry.java
index 0fada69..4c6f3b5 100644
--- a/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/MobileExpenseEntry.java
+++ b/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/MobileExpenseEntry.java
@@ -17,7 +17,6 @@
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.dom.client.Element;
-import com.google.gwt.requestfactory.shared.DeltaValueStore;
 import com.google.gwt.requestfactory.shared.Receiver;
 import com.google.gwt.requestfactory.shared.RequestObject;
 import com.google.gwt.sample.expenses.gwt.request.ExpenseRecord;
@@ -75,9 +74,9 @@
 
   public void create(Long reportId) {
     expense = (ExpenseRecord) requestFactory.create(ExpenseRecord.class);
-    requestObject = requestFactory.expenseRequest().persist();
-    DeltaValueStore deltas = requestObject.getDeltaValueStore();
-    deltas.set(ExpenseRecord.reportId, expense, reportId);
+    requestObject = requestFactory.expenseRequest().persist(expense);
+    ExpenseRecord editableExpense = requestObject.edit(expense);
+    editableExpense.setReportId(reportId);
     displayExpense();
   }
 
@@ -102,14 +101,14 @@
 
   @SuppressWarnings("deprecation")
   public void onCustom() {
-    DeltaValueStore deltas = requestObject.getDeltaValueStore();
-    deltas.set(ExpenseRecord.description, expense, nameText.getText());
-    deltas.set(ExpenseRecord.category, expense, categoryText.getText());
+    ExpenseRecord editableExpense = requestObject.edit(expense);
+    editableExpense.setDescription(nameText.getText());
+    editableExpense.setCategory(categoryText.getText());
 
     // TODO(jgw): validate amount (in dollars -- database is in pennies)
     String amountText = priceText.getText();
     double amount = Double.parseDouble(amountText);
-    deltas.set(ExpenseRecord.amount, expense, amount);
+    editableExpense.setAmount(amount);
 
     // TODO(jgw): Use non-deprecated date methods for this.
     Date date = new Date(
@@ -117,7 +116,7 @@
         dateMonth.getSelectedIndex(),
         dateDay.getSelectedIndex() + 1
     );
-    deltas.set(ExpenseRecord.created, expense, date);
+    editableExpense.setCreated(date);
 
     // TODO: wait throbber
     requestObject.fire(new Receiver<Void>() {
diff --git a/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/MobileReportEntry.java b/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/MobileReportEntry.java
index b5b933a..a08461d 100644
--- a/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/MobileReportEntry.java
+++ b/bikeshed/src/com/google/gwt/sample/expenses/gwt/client/MobileReportEntry.java
@@ -17,10 +17,8 @@
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.dom.client.Element;
-import com.google.gwt.requestfactory.shared.DeltaValueStore;
 import com.google.gwt.requestfactory.shared.Receiver;
 import com.google.gwt.requestfactory.shared.RequestObject;
-import com.google.gwt.sample.expenses.gwt.request.ExpenseRecord;
 import com.google.gwt.sample.expenses.gwt.request.ExpensesRequestFactory;
 import com.google.gwt.sample.expenses.gwt.request.ReportRecord;
 import com.google.gwt.uibinder.client.UiBinder;
@@ -86,8 +84,8 @@
   public void create(Long reporterId) {
     report = (ReportRecord) requestFactory.create(ReportRecord.class);
     requestObject = requestFactory.reportRequest().persist(report);
-    DeltaValueStore deltas = requestObject.getDeltaValueStore();
-    deltas.set(ReportRecord.reporterKey, report, reporterId);
+    ReportRecord editableReport = requestObject.edit(report);
+    report.setReporterKey(reporterId);
     displayReport();
   }
 
@@ -112,16 +110,15 @@
 
   @SuppressWarnings("deprecation")
   public void onCustom() {
-    DeltaValueStore deltas = requestObject.getDeltaValueStore();
-    deltas.set(ReportRecord.purpose, report, purposeText.getText());
-    deltas.set(ReportRecord.notes, report, notesText.getText());
-    deltas.set(ReportRecord.department, report,
-        departmentList.getValue(departmentList.getSelectedIndex()));
+    ReportRecord editableReport = requestObject.edit(report);
+    editableReport.setPurpose(purposeText.getText());
+    editableReport.setNotes(notesText.getText());
+    editableReport.setDepartment(departmentList.getValue(departmentList.getSelectedIndex()));
 
     // TODO(jgw): Use non-deprecated date methods for this.
     Date date = new Date(dateYear.getSelectedIndex() + 100,
         dateMonth.getSelectedIndex(), dateDay.getSelectedIndex() + 1);
-    deltas.set(ExpenseRecord.created, report, date);
+    editableReport.setCreated(date);
 
     // TODO: wait throbber
     requestObject.fire(new Receiver<Void>() {
diff --git a/bikeshed/src/com/google/gwt/sample/expenses/gwt/request/EmployeeRecord.java b/bikeshed/src/com/google/gwt/sample/expenses/gwt/request/EmployeeRecord.java
index b31af5a..21ac793 100644
--- a/bikeshed/src/com/google/gwt/sample/expenses/gwt/request/EmployeeRecord.java
+++ b/bikeshed/src/com/google/gwt/sample/expenses/gwt/request/EmployeeRecord.java
@@ -46,4 +46,16 @@
   Long getSupervisorKey();
 
   String getUserName();
+
+  boolean isChanged();
+
+  void setDepartment(String department);
+
+  void setDisplayName(String displayName);
+
+  void setPassword(String password);
+
+  void setSupervisorKey(Long supervisorKey);
+
+  void setUserName(String userName);
 }
diff --git a/bikeshed/src/com/google/gwt/sample/expenses/gwt/request/ExpenseRecord.java b/bikeshed/src/com/google/gwt/sample/expenses/gwt/request/ExpenseRecord.java
index 5ac0014..268c569 100644
--- a/bikeshed/src/com/google/gwt/sample/expenses/gwt/request/ExpenseRecord.java
+++ b/bikeshed/src/com/google/gwt/sample/expenses/gwt/request/ExpenseRecord.java
@@ -48,9 +48,23 @@
 
   String getDescription();
 
-  Long getId();
-
   String getReasonDenied();
 
   Long getReportId();
+
+  boolean isChanged();
+
+  void setAmount(Double amount);
+
+  void setApproval(String approval);
+
+  void setCategory(String category);
+
+  void setCreated(Date created);
+
+  void setDescription(String description);
+
+  void setReasonDenied(String reasonDenied);
+
+  void setReportId(Long reportId);
 }
diff --git a/bikeshed/src/com/google/gwt/sample/expenses/gwt/request/ExpenseRequest.java b/bikeshed/src/com/google/gwt/sample/expenses/gwt/request/ExpenseRequest.java
index e198862..2fe63e1 100644
--- a/bikeshed/src/com/google/gwt/sample/expenses/gwt/request/ExpenseRequest.java
+++ b/bikeshed/src/com/google/gwt/sample/expenses/gwt/request/ExpenseRequest.java
@@ -49,17 +49,16 @@
   RecordListRequest<ExpenseRecord> findExpensesByReport(
       PropertyReference<Long> reportId);
 
-  // TODO: persist() and remove() methods are hacks for now.
   /**
    * @return a request object
    */
   @Instance
-  RequestObject<Void> persist();
+  RequestObject<Void> persist(ExpenseRecord record);
 
  /**
   * @return a request object
   */
   @Instance
-  RequestObject<Void> remove();
+  RequestObject<Void> remove(ExpenseRecord record);
 
 }
diff --git a/bikeshed/src/com/google/gwt/sample/expenses/gwt/request/ReportRecord.java b/bikeshed/src/com/google/gwt/sample/expenses/gwt/request/ReportRecord.java
index 7d2cca1..d98c4b9 100644
--- a/bikeshed/src/com/google/gwt/sample/expenses/gwt/request/ReportRecord.java
+++ b/bikeshed/src/com/google/gwt/sample/expenses/gwt/request/ReportRecord.java
@@ -50,4 +50,18 @@
   String getPurpose();
   
   Long getReporterKey();
+
+  boolean isChanged();
+
+  void setApprovedSupervisorKey(Long approvedSupervisorKey);
+
+  void setCreated(Date created);
+
+  void setDepartment(String department);
+
+  void setNotes(String notes);
+
+  void setPurpose(String purpose);
+
+  void setReporterKey(Long reporterKey);
 }
diff --git a/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/employee/EmployeeDetailsActivity.java b/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/employee/EmployeeDetailsActivity.java
index 5921a5b..1040a72 100644
--- a/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/employee/EmployeeDetailsActivity.java
+++ b/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/employee/EmployeeDetailsActivity.java
@@ -18,7 +18,6 @@
 import com.google.gwt.app.place.AbstractActivity;
 import com.google.gwt.app.place.PlaceController;
 import com.google.gwt.app.place.RecordDetailsView;
-import com.google.gwt.requestfactory.shared.DeltaValueStore;
 import com.google.gwt.requestfactory.shared.Receiver;
 import com.google.gwt.requestfactory.shared.RequestObject;
 import com.google.gwt.sample.expenses.gwt.client.place.EmployeeScaffoldPlace;
@@ -80,8 +79,7 @@
     }
     
     RequestObject<Void> deleteRequest = requests.employeeRequest().remove(view.getValue());
-    DeltaValueStore deltas = deleteRequest.getDeltaValueStore();
-    deltas.delete(view.getValue());
+    deleteRequest.delete(view.getValue());
     deleteRequest.fire(new Receiver<Void>() {
 
       public void onSuccess(Void ignore, Set<SyncResult> response) {
diff --git a/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/employee/EmployeeEditView.java b/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/employee/EmployeeEditView.java
index f8870f9..0509805 100644
--- a/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/employee/EmployeeEditView.java
+++ b/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/employee/EmployeeEditView.java
@@ -23,7 +23,6 @@
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.dom.client.Style.Display;
 import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.requestfactory.shared.DeltaValueStore;
 import com.google.gwt.sample.expenses.gwt.request.EmployeeRecord;
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
@@ -65,7 +64,6 @@
   @UiField Element createTitle;
 
   private Delegate delegate;
-  private DeltaValueStore deltas;
 
   private EmployeeRecord record;
 
@@ -78,10 +76,6 @@
     return this;
   }
 
-  public DeltaValueStore getDeltaValueStore() {
-    return deltas;
-  }
-
   public Set<Property<?>> getProperties() {
     return DATA_BINDER.getProperties();
   }
@@ -108,10 +102,6 @@
     this.delegate = delegate;
   }
 
-  public void setDeltaValueStore(DeltaValueStore deltas) {
-    this.deltas = deltas;
-  }
-
   public void setEnabled(boolean enabled) {
     DATA_BINDER.setEnabled(this, enabled);
     save.setEnabled(enabled);
diff --git a/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/report/ReportDetailsActivity.java b/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/report/ReportDetailsActivity.java
index 323b0f1..9e761e2 100644
--- a/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/report/ReportDetailsActivity.java
+++ b/bikeshed/src/com/google/gwt/sample/expenses/gwt/ui/report/ReportDetailsActivity.java
@@ -18,7 +18,6 @@
 import com.google.gwt.app.place.AbstractActivity;
 import com.google.gwt.app.place.PlaceController;
 import com.google.gwt.app.place.RecordDetailsView;
-import com.google.gwt.requestfactory.shared.DeltaValueStore;
 import com.google.gwt.requestfactory.shared.Receiver;
 import com.google.gwt.requestfactory.shared.RequestObject;
 import com.google.gwt.sample.expenses.gwt.client.place.ReportScaffoldPlace;
@@ -80,9 +79,7 @@
     }
     
     RequestObject<Void> deleteRequest = requests.reportRequest().remove(view.getValue());
-    // TODO: fix this.
-    DeltaValueStore deltas = deleteRequest.getDeltaValueStore();
-    deltas.delete(view.getValue());
+    deleteRequest.delete(view.getValue());
     deleteRequest.fire(new Receiver<Void>() {
 
       public void onSuccess(Void ignore, Set<SyncResult> response) {
diff --git a/user/src/com/google/gwt/app/place/AbstractRecordEditActivity.java b/user/src/com/google/gwt/app/place/AbstractRecordEditActivity.java
index 01608af..1f2797c 100644
--- a/user/src/com/google/gwt/app/place/AbstractRecordEditActivity.java
+++ b/user/src/com/google/gwt/app/place/AbstractRecordEditActivity.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.app.place;
 
-import com.google.gwt.requestfactory.shared.DeltaValueStore;
 import com.google.gwt.requestfactory.shared.Receiver;
 import com.google.gwt.requestfactory.shared.RequestFactory;
 import com.google.gwt.requestfactory.shared.RequestObject;
@@ -75,7 +74,7 @@
   }
 
   public String mayStop() {
-    if (requestObject != null && requestObject.getDeltaValueStore().isChanged()) {
+    if (requestObject != null && requestObject.isChanged()) {
       return "Are you sure you want to abandon your changes?";
     }
 
@@ -92,8 +91,7 @@
 
   public void saveClicked() {
     assert requestObject != null;
-    DeltaValueStore theDeltas = requestObject.getDeltaValueStore();
-    if (!theDeltas.isChanged()) {
+    if (!requestObject.isChanged()) {
       return;
     }
     view.setEnabled(false);
@@ -128,7 +126,7 @@
           exit();
         } else {
           requestObject = toCommit;
-          requestObject.getDeltaValueStore().clearUsed();
+          requestObject.clearUsed();
           view.setEnabled(true);
         }
       }
@@ -183,10 +181,10 @@
 
   private void doStart(final Display display, R record) {
     setRequestObject(record);
+    R editableRecord = requestObject.edit(record);
     view.setEnabled(true);
-    view.setValue(record);
+    view.setValue(editableRecord);
     view.showErrors(null);
     display.showActivityWidget(view);
-    view.setDeltaValueStore(requestObject.getDeltaValueStore());
   }
 }
diff --git a/user/src/com/google/gwt/app/place/RecordEditView.java b/user/src/com/google/gwt/app/place/RecordEditView.java
index 720138d..32c23bd 100644
--- a/user/src/com/google/gwt/app/place/RecordEditView.java
+++ b/user/src/com/google/gwt/app/place/RecordEditView.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.app.place;
 
-import com.google.gwt.requestfactory.shared.DeltaValueStore;
 import com.google.gwt.user.client.ui.TakesValue;
 import com.google.gwt.valuestore.shared.Record;
 
@@ -42,11 +41,9 @@
     void saveClicked();
   }
   
-  DeltaValueStore getDeltaValueStore();
   boolean isChanged();
   void setCreating(boolean b);
   void setDelegate(Delegate delegate);
-  void setDeltaValueStore(DeltaValueStore deltas);
   void setEnabled(boolean b);
   
   // TODO needs to be Map<Property<?>, String> errors
diff --git a/user/src/com/google/gwt/app/rebind/EditorSupportGenerator.java b/user/src/com/google/gwt/app/rebind/EditorSupportGenerator.java
index 4625338..9df2bbe 100644
--- a/user/src/com/google/gwt/app/rebind/EditorSupportGenerator.java
+++ b/user/src/com/google/gwt/app/rebind/EditorSupportGenerator.java
@@ -92,6 +92,10 @@
 
   JClassType stringType;
 
+  private String capitalize(String name) {
+    return name.substring(0, 1).toUpperCase() + name.substring(1);
+  }
+
   @Override
   public String generate(TreeLogger logger, GeneratorContext generatorContext,
       String interfaceName) throws UnableToCompleteException {
@@ -450,12 +454,8 @@
           + "> event) {");
       sw.indent();
       // recordField and uiFieldEntry have the same name
-      String recordFieldName = uiFieldEntry.getKey().getName();
-      sw.println("view.getDeltaValueStore().set(" + recordType.getName() + "."
-          + recordFieldName + ", view.getValue(),");
-      sw.indent();
-      sw.println("event.getValue());");
-      sw.outdent();
+      sw.println("view.getValue().set"
+          + capitalize(uiFieldEntry.getKey().getName()) + "(event.getValue());");
       sw.outdent();
       sw.println("}");
       sw.outdent();
@@ -479,12 +479,12 @@
           getter = "getText";
         }
         sw.println(String.format(
-            "view.getDeltaValueStore().set(%s.%s, view.getValue(), view.%s.%s());",
-            recordType.getName(), property.getName(),
+            "view.getValue().set%s(view.%s.%s());",
+            capitalize(property.getName()),
             uiFieldEntry.getKey().getName(), getter));
       }
     }
-    sw.println("return view.getDeltaValueStore().isChanged();");
+    sw.println("return view.getValue().isChanged();");
     sw.outdent();
     sw.println("}");
     sw.outdent();
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 78dbe1d..461303b 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonListRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonListRequest.java
@@ -19,8 +19,6 @@
 import com.google.gwt.requestfactory.shared.RecordListRequest;
 import com.google.gwt.valuestore.shared.Record;
 import com.google.gwt.valuestore.shared.SyncResult;
-import com.google.gwt.valuestore.shared.impl.RecordJsoImpl;
-import com.google.gwt.valuestore.shared.impl.RecordSchema;
 
 import java.util.ArrayList;
 import java.util.Collections;
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 fdd4b66..903458f 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonObjectRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractJsonObjectRequest.java
@@ -18,8 +18,6 @@
 import com.google.gwt.requestfactory.shared.RecordRequest;
 import com.google.gwt.valuestore.shared.Record;
 import com.google.gwt.valuestore.shared.SyncResult;
-import com.google.gwt.valuestore.shared.impl.RecordJsoImpl;
-import com.google.gwt.valuestore.shared.impl.RecordSchema;
 
 import java.util.Collections;
 
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 6fad68f..035d5be 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java
@@ -15,10 +15,10 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.requestfactory.shared.DeltaValueStore;
 import com.google.gwt.requestfactory.shared.Receiver;
 import com.google.gwt.requestfactory.shared.RequestObject;
 import com.google.gwt.valuestore.shared.Property;
+import com.google.gwt.valuestore.shared.Record;
 
 import java.util.Collection;
 import java.util.Collections;
@@ -31,8 +31,8 @@
  * development, and is very likely to be deleted. Use it at your own risk.
  * </span>
  * </p>
- * Abstract implementation of {@link RequestObject}. Each request
- * stores a {@link DeltaValueStore}.
+ * Abstract implementation of {@link RequestObject}. Each request stores a
+ * {@link DeltaValueStoreJsonImpl}.
  * 
  * @param <T> return type
  * @param <R> type of this request object
@@ -41,7 +41,7 @@
     implements RequestObject<T> {
 
   protected final RequestFactoryJsonImpl requestFactory;
-  protected DeltaValueStore deltaValueStore;
+  protected DeltaValueStoreJsonImpl deltaValueStore;
   protected Receiver<T> receiver;
 
   private final Set<Property<?>> properties = new HashSet<Property<?>>();
@@ -49,7 +49,24 @@
   public AbstractRequest(RequestFactoryJsonImpl requestFactory) {
     this.requestFactory = requestFactory;
     ValueStoreJsonImpl valueStore = requestFactory.getValueStore();
-    this.deltaValueStore = new DeltaValueStoreJsonImpl(valueStore, requestFactory);
+    this.deltaValueStore = new DeltaValueStoreJsonImpl(valueStore,
+        requestFactory);
+  }
+
+  public void clearUsed() {
+    ((DeltaValueStoreJsonImpl) deltaValueStore).clearUsed();
+  }
+
+  public void delete(Record record) {
+    deltaValueStore.delete(record);
+  }
+
+  @SuppressWarnings("unchecked")
+  public <P extends Record> P edit(P record) {
+    P returnRecordImpl = (P) ((RecordImpl) record).getSchema().create(
+        ((RecordImpl) record).asJso());
+    ((RecordImpl) returnRecordImpl).setDeltaValueStore(deltaValueStore);
+    return returnRecordImpl;
   }
 
   public void fire(Receiver<T> receiver) {
@@ -69,10 +86,6 @@
     return getThis();
   }
 
-  public DeltaValueStore getDeltaValueStore() {
-    return deltaValueStore;
-  }
-
   /**
    * @return the properties
    */
@@ -80,6 +93,10 @@
     return Collections.unmodifiableSet(properties);
   }
 
+  public boolean isChanged() {
+    return ((DeltaValueStoreJsonImpl) deltaValueStore).isChanged();
+  }
+
   public void reset() {
     ValueStoreJsonImpl valueStore = requestFactory.getValueStore();
     deltaValueStore = new DeltaValueStoreJsonImpl(valueStore, requestFactory);
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 9171046..460c0c8 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImpl.java
@@ -17,14 +17,11 @@
 
 import com.google.gwt.core.client.JavaScriptObject;
 import com.google.gwt.core.client.JsArray;
-import com.google.gwt.requestfactory.shared.DeltaValueStore;
 import com.google.gwt.valuestore.client.SyncResultImpl;
 import com.google.gwt.valuestore.shared.Property;
 import com.google.gwt.valuestore.shared.Record;
 import com.google.gwt.valuestore.shared.SyncResult;
 import com.google.gwt.valuestore.shared.WriteOperation;
-import com.google.gwt.valuestore.shared.impl.RecordImpl;
-import com.google.gwt.valuestore.shared.impl.RecordJsoImpl;
 
 import java.util.HashMap;
 import java.util.HashSet;
@@ -36,9 +33,12 @@
  * <span style="color:red">Experimental API: This class is still under rapid
  * development, and is very likely to be deleted. Use it at your own risk.
  * </span>
- * </p> {@link DeltaValueStore} implementation.
+ * </p>
+ * Accumulates the local edits, made in the context of a
+ * {@link com.google.gwt.requestfactory.shared.RequestObject}.
+ * 
  */
-public class DeltaValueStoreJsonImpl implements DeltaValueStore {
+class DeltaValueStoreJsonImpl {
 
   static class ReturnRecord extends JavaScriptObject {
 
@@ -349,10 +349,6 @@
     }
   }
 
-  public DeltaValueStore spawnDeltaView() {
-    throw new UnsupportedOperationException("Auto-generated method stub");
-  }
-
   public String toJson() {
     used = true;
     if (operations.size() > 1) {
diff --git a/user/src/com/google/gwt/valuestore/shared/impl/RecordImpl.java b/user/src/com/google/gwt/requestfactory/client/impl/RecordImpl.java
similarity index 68%
rename from user/src/com/google/gwt/valuestore/shared/impl/RecordImpl.java
rename to user/src/com/google/gwt/requestfactory/client/impl/RecordImpl.java
index fd13ed8..d823962 100644
--- a/user/src/com/google/gwt/valuestore/shared/impl/RecordImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/RecordImpl.java
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.valuestore.shared.impl;
+package com.google.gwt.requestfactory.client.impl;
 
 import com.google.gwt.valuestore.shared.Property;
 import com.google.gwt.valuestore.shared.PropertyReference;
@@ -34,9 +34,11 @@
  */
 public class RecordImpl implements Record {
   private final RecordJsoImpl jso;
+  private DeltaValueStoreJsonImpl deltaValueStore;
 
   protected RecordImpl(RecordJsoImpl record) {
     this.jso = record;
+    deltaValueStore = null;
   }
 
   public RecordJsoImpl asJso() {
@@ -62,4 +64,29 @@
   public Integer getVersion() {
     return jso.getVersion();
   }
+
+  public boolean isChanged() {
+    if (deltaValueStore == null) {
+      return false;
+    }
+    return deltaValueStore.isChanged();
+  }
+
+  public <V> void set(Property<V> property, RecordImpl record, V value) {
+    if (deltaValueStore == null) {
+      throw new UnsupportedOperationException(
+          "Setter methods can't be called before calling edit()");
+    }
+    deltaValueStore.set(property, record, value);
+  }
+
+  /*
+   * TODO: this method is public for the time being. Will become
+   * package-protected once {@link RecordImpl} moves to the same package as
+   * {@link AbstractRequest}.
+   */
+  public void setDeltaValueStore(DeltaValueStoreJsonImpl deltaValueStore) {
+    this.deltaValueStore = deltaValueStore;
+  }
+
 }
diff --git a/user/src/com/google/gwt/valuestore/shared/impl/RecordJsoImpl.java b/user/src/com/google/gwt/requestfactory/client/impl/RecordJsoImpl.java
similarity index 99%
rename from user/src/com/google/gwt/valuestore/shared/impl/RecordJsoImpl.java
rename to user/src/com/google/gwt/requestfactory/client/impl/RecordJsoImpl.java
index a2ba8dc..f530947 100644
--- a/user/src/com/google/gwt/valuestore/shared/impl/RecordJsoImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/RecordJsoImpl.java
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.valuestore.shared.impl;
+package com.google.gwt.requestfactory.client.impl;
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.JavaScriptObject;
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/RecordKey.java b/user/src/com/google/gwt/requestfactory/client/impl/RecordKey.java
index 8389824..c803843 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/RecordKey.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/RecordKey.java
@@ -15,9 +15,6 @@
  */
 package com.google.gwt.requestfactory.client.impl;
 
-import com.google.gwt.valuestore.shared.impl.RecordImpl;
-import com.google.gwt.valuestore.shared.impl.RecordJsoImpl;
-import com.google.gwt.valuestore.shared.impl.RecordSchema;
 
 /**
  * <p>
diff --git a/user/src/com/google/gwt/valuestore/shared/impl/RecordSchema.java b/user/src/com/google/gwt/requestfactory/client/impl/RecordSchema.java
similarity index 97%
rename from user/src/com/google/gwt/valuestore/shared/impl/RecordSchema.java
rename to user/src/com/google/gwt/requestfactory/client/impl/RecordSchema.java
index 24f12e6..06560ed 100644
--- a/user/src/com/google/gwt/valuestore/shared/impl/RecordSchema.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/RecordSchema.java
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.valuestore.shared.impl;
+package com.google.gwt.requestfactory.client.impl;
 
 import com.google.gwt.valuestore.shared.Property;
 import com.google.gwt.valuestore.shared.Record;
diff --git a/user/src/com/google/gwt/valuestore/shared/impl/RecordToTypeMap.java b/user/src/com/google/gwt/requestfactory/client/impl/RecordToTypeMap.java
similarity index 95%
rename from user/src/com/google/gwt/valuestore/shared/impl/RecordToTypeMap.java
rename to user/src/com/google/gwt/requestfactory/client/impl/RecordToTypeMap.java
index 46b5725..7559688 100644
--- a/user/src/com/google/gwt/valuestore/shared/impl/RecordToTypeMap.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/RecordToTypeMap.java
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.valuestore.shared.impl;
+package com.google.gwt.requestfactory.client.impl;
 
 import com.google.gwt.valuestore.shared.Record;
 
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java b/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java
index 3c654d7..7b91595 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/RequestFactoryJsonImpl.java
@@ -29,9 +29,6 @@
 import com.google.gwt.requestfactory.shared.RequestEvent.State;
 import com.google.gwt.user.client.Window.Location;
 import com.google.gwt.valuestore.shared.Record;
-import com.google.gwt.valuestore.shared.impl.RecordJsoImpl;
-import com.google.gwt.valuestore.shared.impl.RecordSchema;
-import com.google.gwt.valuestore.shared.impl.RecordToTypeMap;
 
 import java.util.HashMap;
 import java.util.HashSet;
@@ -108,7 +105,7 @@
         "Content-Type", RequestFactory.JSON_CONTENT_TYPE_UTF8);
     builder.setHeader("pageurl", Location.getHref());
     builder.setRequestData(ClientRequestHelper.getRequestString(requestObject.getRequestData().getRequestMap(
-        ((DeltaValueStoreJsonImpl) requestObject.getDeltaValueStore()).toJson())));
+        ((AbstractRequest) requestObject).deltaValueStore.toJson())));
     builder.setCallback(new RequestCallback() {
 
       public void onError(Request request, Throwable exception) {
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/ValueStoreJsonImpl.java b/user/src/com/google/gwt/requestfactory/client/impl/ValueStoreJsonImpl.java
index ede2fd1..9ab759f 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/ValueStoreJsonImpl.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/ValueStoreJsonImpl.java
@@ -18,7 +18,6 @@
 import com.google.gwt.core.client.JsArray;
 import com.google.gwt.event.shared.HandlerManager;
 import com.google.gwt.valuestore.shared.WriteOperation;
-import com.google.gwt.valuestore.shared.impl.RecordJsoImpl;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java b/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java
index 18c502d..3d84718 100644
--- a/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java
+++ b/user/src/com/google/gwt/requestfactory/rebind/RequestFactoryGenerator.java
@@ -43,6 +43,10 @@
 import com.google.gwt.requestfactory.client.impl.AbstractLongRequest;
 import com.google.gwt.requestfactory.client.impl.AbstractShortRequest;
 import com.google.gwt.requestfactory.client.impl.AbstractVoidRequest;
+import com.google.gwt.requestfactory.client.impl.RecordImpl;
+import com.google.gwt.requestfactory.client.impl.RecordJsoImpl;
+import com.google.gwt.requestfactory.client.impl.RecordSchema;
+import com.google.gwt.requestfactory.client.impl.RecordToTypeMap;
 import com.google.gwt.requestfactory.client.impl.RequestFactoryJsonImpl;
 import com.google.gwt.requestfactory.server.ReflectionBasedOperationRegistry;
 import com.google.gwt.requestfactory.shared.RecordListRequest;
@@ -55,10 +59,6 @@
 import com.google.gwt.valuestore.shared.Record;
 import com.google.gwt.valuestore.shared.RecordChangedEvent;
 import com.google.gwt.valuestore.shared.WriteOperation;
-import com.google.gwt.valuestore.shared.impl.RecordImpl;
-import com.google.gwt.valuestore.shared.impl.RecordJsoImpl;
-import com.google.gwt.valuestore.shared.impl.RecordSchema;
-import com.google.gwt.valuestore.shared.impl.RecordToTypeMap;
 
 import java.io.PrintWriter;
 import java.math.BigDecimal;
@@ -204,6 +204,7 @@
       sw.outdent();
       sw.println("}");
 
+      // getter methods
       for (JField field : publicRecordType.getFields()) {
         JType fieldType = field.getType();
         if (propertyType.getErasedType() == fieldType.getErasedType()) {
@@ -224,6 +225,29 @@
         }
       }
 
+      // setter methods
+      for (JField field : publicRecordType.getFields()) {
+        JType fieldType = field.getType();
+        if (propertyType.getErasedType() == fieldType.getErasedType()) {
+          JParameterizedType parameterized = fieldType.isParameterized();
+          if (parameterized == null) {
+            logger.log(TreeLogger.ERROR, fieldType
+                + " must have its param type set.");
+            throw new UnableToCompleteException();
+          }
+          JClassType returnType = parameterized.getTypeArgs()[0];
+          sw.println();
+          String varName = field.getName();
+          sw.println(String.format("public void set%s(%s %s) {",
+              capitalize(field.getName()), returnType.getQualifiedSourceName(),
+              varName));
+          sw.indent();
+          sw.println(String.format("set(this.%s, this, %s);", field.getName(), varName));
+          sw.outdent();
+          sw.println("}");
+        }
+      }
+
       sw.outdent();
       sw.println("}");
       generatorContext.commit(logger, pw);
@@ -534,7 +558,7 @@
       if ("com.google.gwt.valuestore.shared.PropertyReference".equals(parameter.getType().getQualifiedBinaryName())) {
         sb.append(".get()");
       }
-      JClassType classType = parameter.getType().isClass();
+      JClassType classType = parameter.getType().isClassOrInterface();
       if (classType != null
           && classType.isAssignableTo(typeOracle.findType(Record.class.getName()))) {
         sb.append(".getId()");
diff --git a/user/src/com/google/gwt/requestfactory/shared/DeltaValueStore.java b/user/src/com/google/gwt/requestfactory/shared/DeltaValueStore.java
deleted file mode 100644
index 045bcc7..0000000
--- a/user/src/com/google/gwt/requestfactory/shared/DeltaValueStore.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.requestfactory.shared;
-
-import com.google.gwt.valuestore.shared.Property;
-import com.google.gwt.valuestore.shared.Record;
-
-/**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
- * Set of changes to a ValueStore.
- */
-public interface DeltaValueStore {
-
-  /**
-   * Enable a DeltaValueStore to be reused again. For example, when the edit
-   * fails on the server.
-   */
-  void clearUsed();
-
-  void delete(Record record);
-
-  /**
-   * Return true if there are outstanding changes that have not been
-   * communicated to the server yet. Note that it is illegal to call this method
-   * after a request using it has been fired.
-   */
-  boolean isChanged();
-
-  <V> void set(Property<V> property, Record record, V value);
-}
diff --git a/user/src/com/google/gwt/requestfactory/shared/RequestObject.java b/user/src/com/google/gwt/requestfactory/shared/RequestObject.java
index 13deafc..f35fcf8 100644
--- a/user/src/com/google/gwt/requestfactory/shared/RequestObject.java
+++ b/user/src/com/google/gwt/requestfactory/shared/RequestObject.java
@@ -15,6 +15,8 @@
  */
 package com.google.gwt.requestfactory.shared;
 
+import com.google.gwt.valuestore.shared.Record;
+
 /**
  * <p>
  * <span style="color:red">Experimental API: This class is still under rapid
@@ -25,16 +27,33 @@
  * @param <T> The return type of objects in the corresponding response.
  */
 public interface RequestObject<T> {
-  // reset the DeltaValueStore.
-  void reset();
+
+  /**
+   * Enable a RequestObject to be reused again. For example, when the edit
+   * fails on the server.
+   */
+  void clearUsed();
+
+  // TODO: temporary hack so that I could get rid of DeltaValueStore. This will
+  // be removed once the hack for SYNC requests goes away.
+  void delete(Record record);
+
+  <P extends Record> P edit(P record);
 
   void fire(Receiver<T> receiver);
 
-  // can get access to a DeltaValueStore only in the context of a RequestObject.
-  DeltaValueStore getDeltaValueStore();
-
   RequestData getRequestData();
 
   void handleResponseText(String responseText);
+
+  /**
+   * Return true if there are outstanding changes that have not been
+   * communicated to the server yet. Note that it is illegal to call this method
+   * after a request using it has been fired.
+   */
+  boolean isChanged();
+
+  // reset the DeltaValueStore.
+  void reset();
   
 }
\ No newline at end of file
diff --git a/user/test/com/google/gwt/requestfactory/RequestFactorySuite.java b/user/test/com/google/gwt/requestfactory/RequestFactorySuite.java
new file mode 100644
index 0000000..67a43c2
--- /dev/null
+++ b/user/test/com/google/gwt/requestfactory/RequestFactorySuite.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.requestfactory;
+
+import com.google.gwt.junit.tools.GWTTestSuite;
+import com.google.gwt.requestfactory.client.impl.DeltaValueStoreJsonImplTest;
+import com.google.gwt.requestfactory.client.impl.RecordJsoImplTest;
+
+import junit.framework.Test;
+
+/**
+ *
+ */
+public class RequestFactorySuite {
+  public static Test suite() {
+    GWTTestSuite suite = new GWTTestSuite(
+        "Test suite for all requestfactory code.");
+    suite.addTestSuite(RecordJsoImplTest.class);
+    suite.addTestSuite(DeltaValueStoreJsonImplTest.class);
+    return suite;
+  }
+}
diff --git a/user/test/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImplTest.java b/user/test/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImplTest.java
index 555dec3..33ade39 100644
--- a/user/test/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImplTest.java
+++ b/user/test/com/google/gwt/requestfactory/client/impl/DeltaValueStoreJsonImplTest.java
@@ -24,11 +24,6 @@
 import com.google.gwt.valuestore.shared.Record;
 import com.google.gwt.valuestore.shared.SimpleFooRecord;
 import com.google.gwt.valuestore.shared.WriteOperation;
-import com.google.gwt.valuestore.shared.impl.RecordImpl;
-import com.google.gwt.valuestore.shared.impl.RecordJsoImpl;
-import com.google.gwt.valuestore.shared.impl.RecordSchema;
-import com.google.gwt.valuestore.shared.impl.RecordToTypeMap;
-import com.google.gwt.valuestore.shared.impl.SimpleFooRecordImpl;
 
 import java.util.Date;
 
diff --git a/user/test/com/google/gwt/valuestore/shared/impl/RecordJsoImplTest.java b/user/test/com/google/gwt/requestfactory/client/impl/RecordJsoImplTest.java
similarity index 97%
rename from user/test/com/google/gwt/valuestore/shared/impl/RecordJsoImplTest.java
rename to user/test/com/google/gwt/requestfactory/client/impl/RecordJsoImplTest.java
index 17e8ac7..7a9635b 100644
--- a/user/test/com/google/gwt/valuestore/shared/impl/RecordJsoImplTest.java
+++ b/user/test/com/google/gwt/requestfactory/client/impl/RecordJsoImplTest.java
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.valuestore.shared.impl;
+package com.google.gwt.requestfactory.client.impl;
 
 import com.google.gwt.core.client.JsArray;
 import com.google.gwt.junit.client.GWTTestCase;
@@ -36,7 +36,7 @@
 
   @Override
   public String getModuleName() {
-    return "com.google.gwt.valuestore.ValueStoreSuite";
+    return "com.google.gwt.requestfactory.RequestFactoryTest";
   }
 
   public void testEmptyCopy() {
diff --git a/user/test/com/google/gwt/valuestore/shared/impl/SimpleFooRecordImpl.java b/user/test/com/google/gwt/requestfactory/client/impl/SimpleFooRecordImpl.java
similarity index 97%
rename from user/test/com/google/gwt/valuestore/shared/impl/SimpleFooRecordImpl.java
rename to user/test/com/google/gwt/requestfactory/client/impl/SimpleFooRecordImpl.java
index 44b4696..0430812 100644
--- a/user/test/com/google/gwt/valuestore/shared/impl/SimpleFooRecordImpl.java
+++ b/user/test/com/google/gwt/requestfactory/client/impl/SimpleFooRecordImpl.java
@@ -13,7 +13,7 @@
  * License for the specific language governing permissions and limitations under
  * the License.
  */
-package com.google.gwt.valuestore.shared.impl;
+package com.google.gwt.requestfactory.client.impl;
 
 import com.google.gwt.valuestore.shared.Property;
 import com.google.gwt.valuestore.shared.Record;
diff --git a/user/test/com/google/gwt/valuestore/ValueStoreSuite.java b/user/test/com/google/gwt/valuestore/ValueStoreSuite.java
index 61864ef..b289377 100644
--- a/user/test/com/google/gwt/valuestore/ValueStoreSuite.java
+++ b/user/test/com/google/gwt/valuestore/ValueStoreSuite.java
@@ -17,7 +17,6 @@
 
 import com.google.gwt.junit.tools.GWTTestSuite;
 import com.google.gwt.valuestore.client.RequestFactoryTest;
-import com.google.gwt.valuestore.shared.impl.RecordJsoImplTest;
 
 import junit.framework.Test;
 
@@ -28,7 +27,6 @@
   public static Test suite() {
     GWTTestSuite suite = new GWTTestSuite(
         "Test suite for all valuestore code.");
-    suite.addTestSuite(RecordJsoImplTest.class);
     suite.addTestSuite(RequestFactoryTest.class);
     return suite;
   }