First pass at implementation and testing of reusable builders.
diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestImportProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestImportProtoFile.cs
index 5749c97..75e746a 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestImportProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestImportProtoFile.cs
@@ -169,7 +169,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

     public override Builder CreateBuilderForType() { return new Builder(); }

     public static Builder CreateBuilder(ImportMessage prototype) {

-      return (Builder) new Builder().MergeFrom(prototype);

+      return new Builder(prototype);

     }

     

     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]

@@ -179,21 +179,48 @@
       protected override Builder ThisBuilder {

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new ImportMessage();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(ImportMessage cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      ImportMessage result = new ImportMessage();

+      bool builderIsReadOnly;

+      ImportMessage result;

+      

+      private ImportMessage PrepareBuilder() {

+        if (builderIsReadOnly) {

+          ImportMessage original = result;

+          result = new ImportMessage();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override ImportMessage MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new ImportMessage();

+        result = DefaultInstance ?? new ImportMessage();

+        builderIsReadOnly = true;

         return this;

       }

       

       public override Builder Clone() {

-        return new Builder().MergeFrom(result);

+        if (builderIsReadOnly) {

+          return new Builder(result);

+        } else {

+          return new Builder().MergeFrom(result);

+        }

       }

       

       public override pbd::MessageDescriptor DescriptorForType {

@@ -205,12 +232,11 @@
       }

       

       public override ImportMessage BuildPartial() {

-        if (result == null) {

-          throw new global::System.InvalidOperationException("build() has already been called on this Builder");

+        if (builderIsReadOnly) {

+          return result;

         }

-        ImportMessage returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

       public override Builder MergeFrom(pb::IMessage other) {

@@ -224,6 +250,7 @@
       

       public override Builder MergeFrom(ImportMessage other) {

         if (other == global::Google.ProtocolBuffers.TestProtos.ImportMessage.DefaultInstance) return this;

+        PrepareBuilder();

         if (other.HasD) {

           D = other.D;

         }

@@ -236,6 +263,7 @@
       }

       

       public override Builder MergeFrom(pb::ICodedInputStream input, pb::ExtensionRegistry extensionRegistry) {

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -291,11 +319,13 @@
         set { SetD(value); }

       }

       public Builder SetD(int value) {

+        PrepareBuilder();

         result.hasD = true;

         result.d_ = value;

         return this;

       }

       public Builder ClearD() {

+        PrepareBuilder();

         result.hasD = false;

         result.d_ = 0;

         return this;