Added removeMember() and altered a few comments.
diff --git a/include/json/value.h b/include/json/value.h
index 376b495..2453cb1 100644
--- a/include/json/value.h
+++ b/include/json/value.h
@@ -270,9 +270,10 @@
       /// otherwise returns defaultValue.

       Value get( UInt index, 

                  const Value &defaultValue ) const;

-      /// Returns true if index < size().

+      /// Return true if index < size().

       bool isValidIndex( UInt index ) const;

-      /// Append value to array at the end.

+      /// \brief Append value to array at the end.

+      ///

       /// Equivalent to jsonvalue[jsonvalue.size()] = value;

       Value &append( const Value &value );

 

@@ -302,27 +303,41 @@
       /// Access an object value by name, returns null if there is no member with that name.

       const Value &operator[]( const CppTL::ConstString &key ) const;

 # endif

-      /// Returns the member named key if it exist, defaultValue otherwise.

+      /// Return the member named key if it exist, defaultValue otherwise.

       Value get( const char *key, 

                  const Value &defaultValue ) const;

-      /// Returns the member named key if it exist, defaultValue otherwise.

+      /// Return the member named key if it exist, defaultValue otherwise.

       Value get( const std::string &key,

                  const Value &defaultValue ) const;

 # ifdef JSON_USE_CPPTL

-      /// Returns the member named key if it exist, defaultValue otherwise.

+      /// Return the member named key if it exist, defaultValue otherwise.

       Value get( const CppTL::ConstString &key,

                  const Value &defaultValue ) const;

 # endif

-      /// Returns true if the object has a member named key.

+      /// \brief Remove and return the named member.  

+      ///

+      /// Do nothing if it did not exist.

+      /// \return the removed Value, or null.

+      /// \pre type() is objectValue or nullValue

+      /// \post type() is unchanged

+      Value removeMember( const char* key );

+      /// Same as removeMember(const char*)

+      Value removeMember( const std::string &key );

+

+      /// Return true if the object has a member named key.

       bool isMember( const char *key ) const;

-      /// Returns true if the object has a member named key.

+      /// Return true if the object has a member named key.

       bool isMember( const std::string &key ) const;

 # ifdef JSON_USE_CPPTL

-      /// Returns true if the object has a member named key.

+      /// Return true if the object has a member named key.

       bool isMember( const CppTL::ConstString &key ) const;

 # endif

 

-      // Returns a list of the member names.

+      /// \brief Return a list of the member names.

+      ///

+      /// If null, return an empty list.

+      /// \pre type() is objectValue or nullValue

+      /// \post if type() was nullValue, it remains nullValue

       Members getMemberNames() const;

 

 //# ifdef JSON_USE_CPPTL

@@ -337,6 +352,7 @@
       void setComment( const std::string &comment,

                        CommentPlacement placement );

       bool hasComment( CommentPlacement placement ) const;

+      /// Include delimiters and embedded newlines.

       std::string getComment( CommentPlacement placement ) const;

 

       std::string toStyledString() const;

@@ -864,13 +880,13 @@
          return computeDistance( other );

       }

 

-      /// Returns either the index or the member name of the referenced value as a Value.

+      /// Return either the index or the member name of the referenced value as a Value.

       Value key() const;

 

-      /// Returns the index of the referenced Value. -1 if it is not an arrayValue.

+      /// Return the index of the referenced Value. -1 if it is not an arrayValue.

       Value::UInt index() const;

 

-      /// Returns the member name of the referenced Value. "" if it is not an objectValue.

+      /// Return the member name of the referenced Value. "" if it is not an objectValue.

       const char *memberName() const;

 

    protected:

diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp
index e93e346..5fbbe13 100644
--- a/src/lib_json/json_value.cpp
+++ b/src/lib_json/json_value.cpp
@@ -1103,6 +1103,37 @@
    return get( key.c_str(), defaultValue );

 }

 

+Value

+Value::removeMember( const char* key )

+{

+   JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );

+   if ( type_ == nullValue )

+      return null;

+#ifndef JSON_VALUE_USE_INTERNAL_MAP

+   CZString actualKey( key, CZString::noDuplication );

+   ObjectValues::iterator it = value_.map_->find( actualKey );

+   if ( it == value_.map_->end() )

+      return null;

+   Value old(it->second);

+   value_.map_->erase(it);

+   return old;

+#else

+   Value *value = value_.map_->find( key );

+   if (value){

+      Value old(*value);

+      value_.map_.remove( key );

+      return old;

+   } else {

+      return null;

+   }

+#endif

+}

+

+Value

+Value::removeMember( const std::string &key )

+{

+   return removeMember( key.c_str() );

+}

 

 # ifdef JSON_USE_CPPTL

 Value 

@@ -1140,6 +1171,8 @@
 Value::getMemberNames() const

 {

    JSON_ASSERT( type_ == nullValue  ||  type_ == objectValue );

+   if ( type_ == nullValue )

+       return Value::Members();

    Members members;

    members.reserve( value_.map_->size() );

 #ifndef JSON_VALUE_USE_INTERNAL_MAP