First pass at implementation and testing of reusable builders.
diff --git a/src/ProtocolBuffers.Test/TestProtos/UnitTestCSharpOptionsProtoFile.cs b/src/ProtocolBuffers.Test/TestProtos/UnitTestCSharpOptionsProtoFile.cs
index ff726d6..215b9b4 100644
--- a/src/ProtocolBuffers.Test/TestProtos/UnitTestCSharpOptionsProtoFile.cs
+++ b/src/ProtocolBuffers.Test/TestProtos/UnitTestCSharpOptionsProtoFile.cs
@@ -190,7 +190,7 @@
     public override Builder ToBuilder() { return CreateBuilder(this); }

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

     public static Builder CreateBuilder(OptionsMessage prototype) {

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

+      return new Builder(prototype);

     }

     

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

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

         get { return this; }

       }

-      public Builder() {}

+      public Builder() {

+        result = DefaultInstance ?? new OptionsMessage();

+        builderIsReadOnly = result == DefaultInstance;

+      }

+      internal Builder(OptionsMessage cloneFrom) {

+        result = cloneFrom;

+        builderIsReadOnly = true;

+      }

       

-      OptionsMessage result = new OptionsMessage();

+      bool builderIsReadOnly;

+      OptionsMessage result;

+      

+      private OptionsMessage PrepareBuilder() {

+        if (builderIsReadOnly) {

+          OptionsMessage original = result;

+          result = new OptionsMessage();

+          builderIsReadOnly = false;

+          MergeFrom(original);

+        }

+        return result;

+      }

+      

+      public override bool IsInitialized {

+        get { return result.IsInitialized; }

+      }

       

       protected override OptionsMessage MessageBeingBuilt {

-        get { return result; }

+        get { return PrepareBuilder(); }

       }

       

       public override Builder Clear() {

-        result = new OptionsMessage();

+        result = DefaultInstance ?? new OptionsMessage();

+        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 {

@@ -226,12 +253,11 @@
       }

       

       public override OptionsMessage BuildPartial() {

-        if (result == null) {

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

+        if (builderIsReadOnly) {

+          return result;

         }

-        OptionsMessage returnMe = result;

-        result = null;

-        return returnMe;

+        builderIsReadOnly = true;

+        return result;

       }

       

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

@@ -245,6 +271,7 @@
       

       public override Builder MergeFrom(OptionsMessage other) {

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

+        PrepareBuilder();

         if (other.HasNormal) {

           Normal = other.Normal;

         }

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

       

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

+        PrepareBuilder();

         pb::UnknownFieldSet.Builder unknownFields = null;

         uint tag;

         string field_name;

@@ -327,11 +355,13 @@
       }

       public Builder SetNormal(string value) {

         pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

         result.hasNormal = true;

         result.normal_ = value;

         return this;

       }

       public Builder ClearNormal() {

+        PrepareBuilder();

         result.hasNormal = false;

         result.normal_ = "";

         return this;

@@ -346,11 +376,13 @@
       }

       public Builder SetOptionsMessage_(string value) {

         pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

         result.hasOptionsMessage_ = true;

         result.optionsMessage_ = value;

         return this;

       }

       public Builder ClearOptionsMessage_() {

+        PrepareBuilder();

         result.hasOptionsMessage_ = false;

         result.optionsMessage_ = "";

         return this;

@@ -365,11 +397,13 @@
       }

       public Builder SetCustomName(string value) {

         pb::ThrowHelper.ThrowIfNull(value, "value");

+        PrepareBuilder();

         result.hasCustomName = true;

         result.customized_ = value;

         return this;

       }

       public Builder ClearCustomName() {

+        PrepareBuilder();

         result.hasCustomName = false;

         result.customized_ = "";

         return this;