Change Component setFromEscapedString and setSegment to static makeFromEscapedString and makeSegment, and make the class read-only.
diff --git a/ndn-cpp/name.cpp b/ndn-cpp/name.cpp
index d94eecd..2b5c6a9 100644
--- a/ndn-cpp/name.cpp
+++ b/ndn-cpp/name.cpp
@@ -103,7 +103,7 @@
   return result.str();
 }
 
-bool Name::Component::setFromEscapedString(const char *escapedString, unsigned int beginOffset, unsigned int endOffset)
+Blob Name::Component::makeFromEscapedString(const char *escapedString, unsigned int beginOffset, unsigned int endOffset)
 {
   string trimmedString(escapedString + beginOffset, escapedString + endOffset);
   trim(trimmedString);
@@ -113,18 +113,16 @@
     // Special case for component of only periods.  
     if (component.size() <= 2)
       // Zero, one or two periods is illegal.  Ignore this component.
-      return false;
+      return Blob();
     else
       // Remove 3 periods.
-      value_ = Blob((const unsigned char *)&component[3], component.size() - 3); 
+      return Blob((const unsigned char *)&component[3], component.size() - 3); 
   }
   else
-    value_ = Blob((const unsigned char *)&component[0], component.size()); 
-  
-  return true;
+    return Blob((const unsigned char *)&component[0], component.size()); 
 }
 
-void Name::Component::setSegment(unsigned long segment)
+Blob Name::Component::makeSegment(unsigned long segment)
 {
   ptr_lib::shared_ptr<vector<unsigned char> > value;
   
@@ -139,7 +137,7 @@
   
   // Make it big endian.
   reverse(value->begin() + 1, value->end());
-  value_ = value;
+  return Blob(value);
 }
 
 void Name::set(const char *uri_cstr) 
@@ -189,10 +187,10 @@
     if (iComponentEnd == string::npos)
       iComponentEnd = uri.size();
     
-    components_.push_back(Component());
-    if (!components_[components_.size() - 1].setFromEscapedString(&uri[0], iComponentStart, iComponentEnd))
-      // Ignore the illegal component.  This also gets rid of a trailing '/'.
-      components_.pop_back();
+    Blob component = Component::makeFromEscapedString(&uri[0], iComponentStart, iComponentEnd);
+    // Ignore illegal components.  This also gets rid of a trailing '/'.
+    if (component)
+      components_.push_back(Component(component));
     
     iComponentStart = iComponentEnd + 1;
   }