Index: /trunk/src/lib/graphics/graphics_engine.cc
===================================================================
--- /trunk/src/lib/graphics/graphics_engine.cc	(revision 7318)
+++ /trunk/src/lib/graphics/graphics_engine.cc	(revision 7319)
@@ -317,6 +317,6 @@
   PRINT(4)("Running on : vendor: %s,  renderer: %s,  version:%s\n", vendor, renderer, version);
   PRINT(4)("Extensions:\n");
-  for (unsigned int i = 0; i < this->hwExtensions.getCount(); i++)
-    PRINT(4)("%d: %s\n", i, this->hwExtensions.getString(i).c_str());
+  for (unsigned int i = 0; i < this->hwExtensions.size(); i++)
+    PRINT(4)("%d: %s\n", i, this->hwExtensions[i].c_str());
 
 
@@ -514,5 +514,5 @@
 bool GraphicsEngine::hwSupportsEXT(const std::string& extension)
 {
-  for (unsigned int i = 0; i < this->hwExtensions.getCount(); i++)
+  for (unsigned int i = 0; i < this->hwExtensions.size(); i++)
     if ( this->hwExtensions.getString(i) == extension)
       return true;
Index: /trunk/src/lib/parser/cmdline_parser/cmdline_parser.cc
===================================================================
--- /trunk/src/lib/parser/cmdline_parser/cmdline_parser.cc	(revision 7318)
+++ /trunk/src/lib/parser/cmdline_parser/cmdline_parser.cc	(revision 7319)
@@ -11,5 +11,5 @@
    ### File Specific:
    main-programmer: Christoph Renner
-   co-programmer: 
+   co-programmer:
 */
 
@@ -40,5 +40,5 @@
 {
   ArgTableEntry entry;
-  
+
   entry.id = id;
   entry.longOption = longOption;
@@ -47,5 +47,5 @@
   entry.argNames = argNames;
   entry.help = help;
-  
+
   if ( back )
     argTable.push_back( entry );
@@ -58,12 +58,12 @@
 {
   this->exeName = argv[0];
-  
+
   //put all args in vector
   std::vector<std::string> args;
-  
+
   for ( int i = 1; i<argc; i++ )
   {
     std::string s = argv[i];
-    
+
     if ( s.find( "=" ) == std::string::npos )
     {
@@ -88,5 +88,5 @@
       op.erase( op.find("=") );
       ar.erase( 0, ar.find("=")+1);
-      
+
       //PRINTF(0)("'%s' '%s'\n", op.c_str(), ar.c_str());
       args.push_back( op );
@@ -94,11 +94,11 @@
     }
   }
-  
+
   int i = 0;
-  
+
   ArgTable::iterator it;
   bool finish;
   bool found;
-  
+
   while ( i < args.size() )
   {
@@ -109,7 +109,7 @@
       {
         found = true;
-        
+
         int posArgs = 1;
-        
+
         while ( i + posArgs < args.size() )
         {
@@ -119,7 +119,7 @@
             posArgs++;
         }
-        
+
         posArgs--;
-        
+
         if ( it->numArgs > posArgs )
         {
@@ -127,15 +127,15 @@
           return false;
         }
-        
+
         std::vector<MultiType> argArgs;
-        
+
         for ( int j = 1; j <= it->numArgs; j++ )
           argArgs.push_back( args[i+j] );
-        
+
         if ( !cb( *it, data, args[i], argArgs ) )
           return false;
-        
+
         i += it->numArgs;
-        
+
         if ( finish )
         {
@@ -143,11 +143,11 @@
           break;
         }
-        else 
-        { 
+        else
+        {
           assert( it->numArgs == 0 );
         }
       }
     }
-    
+
     if ( !found )
     {
@@ -156,5 +156,5 @@
     }
   }
-  
+
   return true;
 }
@@ -163,8 +163,8 @@
 {
   finish = true;
-  
+
   if ( arg.length() < 2 )
     return false;
-  
+
   if ( arg[0] == '-' )
   {
@@ -172,5 +172,5 @@
     {
       arg.erase( 0, 2 );
-      
+
       if ( entry.longOption.find('%') != std::string::npos )
       {
@@ -208,20 +208,20 @@
   printf("Usage: %s [options]\n", exeName.c_str());
   printf("\n");
-  
+
   std::list<std::vector<std::string> > output;
-  
+
   for ( ArgTable::iterator it = argTable.begin(); it != argTable.end(); it++ )
   {
     output.push_back( std::vector<std::string>() );
-    
+
     SubString substr( it->argNames );
     std::string args;
-    assert( it->numArgs == substr.getCount() );
-      
+    assert( it->numArgs == substr.size() );
+
     for ( int i = 0; i<it->numArgs; i++ )
     {
       args += " [" + substr[i] + "]";
     }
-    
+
     if ( it->shortOption != '\0' )
     {
@@ -231,53 +231,53 @@
     else
       output.back().push_back( "" );
-    
+
     if ( it->longOption != "" )
     {
       output.back().push_back( "--" + it->longOption );
-      
+
       output.back().back() += args;
     }
     else
       output.back().push_back( "" );
-    
+
     output.back().push_back( it->help );
   }
-  
+
   output.push_back( std::vector<std::string>() );
   output.back().push_back( "Option" );
   output.back().push_back( "Long option" );
   output.back().push_back( "Description" );
-  
+
   output.reverse();
-  
+
   int maxShort = 0;
   int maxLong = 0;
-  
+
   std::list<std::vector<std::string> >::const_iterator it;
-  
+
   for ( it = output.begin(); it != output.end(); it++ )
   {
     if ( (*it)[0].length() > maxShort )
       maxShort = (*it)[0].length();
-    
+
     if ( (*it)[1].length() > maxLong )
       maxLong = (*it)[1].length();
   }
-  
+
   for ( it = output.begin(); it != output.end(); it++ )
   {
     printf("%s ", (*it)[0].c_str());
-    
+
     for ( int i = 0; i<maxShort-(*it)[0].length(); i++ )
       printf(" ");
-    
+
     printf("%s ", (*it)[1].c_str());
-    
+
     for ( int i = 0; i<maxLong-(*it)[1].length(); i++ )
       printf(" ");
-    
+
     printf("%s\n", (*it)[2].c_str());
   }
-  
+
   exit(0);
 }
Index: /trunk/src/lib/shell/shell_command.cc
===================================================================
--- /trunk/src/lib/shell/shell_command.cc	(revision 7318)
+++ /trunk/src/lib/shell/shell_command.cc	(revision 7319)
@@ -165,7 +165,7 @@
   SubString inputSplits(executionString, " \t\n,");
 
-  if (inputSplits.getCount() == 0)
+  if (inputSplits.size() == 0)
     return false;
-  if (inputSplits.getCount() >= 1)
+  if (inputSplits.size() >= 1)
   {
     // CHECK FOR ALIAS
@@ -181,5 +181,5 @@
           if (objectList != NULL)
           {
-            if (inputSplits.getCount() > 1)
+            if (inputSplits.size() > 1)
             {
 
@@ -210,5 +210,5 @@
     }
 
-    if (commandClass != NULL && inputSplits.getCount() >= 2)
+    if (commandClass != NULL && inputSplits.size() >= 2)
     {
       if (objectList != NULL)
@@ -231,5 +231,5 @@
       }
       // match a function.
-      if (commandClass != NULL && (fktPos == 1 || (fktPos == 2 && inputSplits.getCount() >= 3)))
+      if (commandClass != NULL && (fktPos == 1 || (fktPos == 2 && inputSplits.size() >= 3)))
       {
         list<ShellCommand*>::iterator cmdIT;
@@ -240,5 +240,5 @@
             if (objectPointer == NULL && (*cmdIT)->executor->getType() & Executor_Objective)
               return false;
-            if (inputSplits.getCount() > fktPos+1)
+            if (inputSplits.size() > fktPos+1)
               (*cmdIT)->executor->execute(objectPointer, executionString.substr(inputSplits.getOffset(fktPos +1))); /// TODO CHECK IF OK
             else
Index: /trunk/src/lib/shell/shell_completion.cc
===================================================================
--- /trunk/src/lib/shell/shell_completion.cc	(revision 7318)
+++ /trunk/src/lib/shell/shell_completion.cc	(revision 7319)
@@ -88,13 +88,13 @@
     completeString = "";
   else
-    completeString = inputSplits.getString(inputSplits.getCount()-1).c_str();
+    completeString = inputSplits.getString(inputSplits.size()-1).c_str();
 
   // CLASS COMPLETION
-  if (inputSplits.getCount() == 0)
+  if (inputSplits.size() == 0)
   {
     completeType |= SHELLC_CLASS;
     completeType |= SHELLC_ALIAS;
   }
-  else if (inputSplits.getCount() == 1 && emptyComplete == false)
+  else if (inputSplits.size() == 1 && emptyComplete == false)
   {
     completeType |= SHELLC_CLASS;
@@ -103,6 +103,6 @@
 
   // OBJECT/FUNCTION COMPLETIONS
-  else if ((inputSplits.getCount() == 1 && emptyComplete == true) ||
-            (inputSplits.getCount() == 2 && emptyComplete == false))
+  else if ((inputSplits.size() == 1 && emptyComplete == true) ||
+            (inputSplits.size() == 2 && emptyComplete == false))
   {
     classID = ClassList::StringToID(inputSplits.getString(0).c_str()); //FIXME
@@ -113,6 +113,6 @@
       completeType |= SHELLC_FUNCTION;
   }
-  else if ((inputSplits.getCount() == 2 && emptyComplete == true) ||
-            (inputSplits.getCount() == 3 && emptyComplete == false))
+  else if ((inputSplits.size() == 2 && emptyComplete == true) ||
+            (inputSplits.size() == 3 && emptyComplete == false))
   {
     classID = ClassList::StringToID(inputSplits.getString(0) .c_str()); // FIXME
Index: /trunk/src/lib/util/substring.cc
===================================================================
--- /trunk/src/lib/util/substring.cc	(revision 7318)
+++ /trunk/src/lib/util/substring.cc	(revision 7319)
@@ -26,10 +26,4 @@
 */
 
-
-/**
- *  breaks a string into parts that were initially seperated by comma
- * @param string the string to break into substrings
-*/
-
 #include "substring.h"
 
@@ -37,4 +31,9 @@
 #include <cassert>
 
+/**
+ * @brief create a SubString from
+ * @param string the String to Spilit
+ * @param splitter the Character at which to split string (delimiter)
+ */
 SubString::SubString(const std::string& string, char splitter)
 {
@@ -47,27 +46,116 @@
 
 /**
- * Splits a String into a Substring removing all whiteSpaces
+ * @brief Splits a String into a SubString removing all whiteSpaces
  * @param string the String to Split
- * @param whiteSpaces MUST BE __TRUE__
- *
+ * @param whiteSpaces MUST BE __TRUE__ or __FALSE__ (will be ignored)
  */
 SubString::SubString(const std::string& string, bool whiteSpaces)
 {
   SubString::splitLine(this->strings, this->offsets,
-                      string);
-}
+                       string);
+}
+
+/**
+ * @brief Splits a String into multiple splitters.
+ * @param string the String to split
+ * @param splitters multiple set of characters at what to split. (delimiters)
+ * @param escapeChar The Escape Character that overrides splitters commends and so on...
+ * @param safemode_char within these characters splitting won't happen
+ * @param comment_char the Comment character.
+ */
 SubString::SubString(const std::string& string, const std::string& splitters, char escapeChar,char safemode_char, char comment_char)
 {
   SubString::splitLine(this->strings, this->offsets,
-                       string, splitters, escapeChar, safemode_char);
-}
-
-/**
- * An empty String
+                       string, splitters, escapeChar, safemode_char, comment_char);
+}
+
+/**
+ * @brief creates a SubSet of a SubString.
+ * @param subString the SubString to take a set from.
+ * @param subSetBegin the beginning to the end
+ */
+SubString::SubString(const SubString& subString, unsigned int subSetBegin)
+{
+  for (unsigned int i = subSetBegin; i < subString.size(); i++)
+    this->strings.push_back(subString[i]);
+}
+
+
+/**
+ * @brief creates a SubSet of a SubString.
+ * @param subString the SubString to take a Set from
+ * @param subSetBegin the beginning to the end
+ * @param subSetEnd the end of the SubSet (max subString.size() will be checked internaly)
+ */
+SubString::SubString(const SubString& subString, unsigned int subSetBegin, unsigned int subSetEnd)
+{
+  for (unsigned int i = subSetBegin; i < subString.size() || i < subSetEnd; i++)
+    this->strings.push_back(subString[i]);
+}
+
+
+/**
+ * @brief removes the object from memory
+ */
+SubString::~SubString()
+{ }
+
+/**
+ * @brief An empty String
  */
 const std::string SubString::emptyString = "";
 
-
-
+/**
+ * @brief stores the Value of subString in this SubString
+ * @param subString will be copied into this String.
+ * @returns this SubString.
+ */
+SubString& SubString::operator=(const SubString& subString)
+{
+  this->offsets = subString.offsets;
+  this->strings = subString.strings;
+  return *this;
+}
+
+
+/**
+ * @brief comparator.
+ * @param subString the SubString to compare against this one.
+ * @returns true if the Stored Strings match
+ */
+bool SubString::operator==(const SubString& subString)
+{
+  return (this->strings == subString.strings);
+}
+
+
+/**
+ * @brief append operator
+ * @param subString the String to append.
+ * @returns a SubString where this and subString are appended.
+ */
+SubString SubString::operator+(const SubString& subString) const
+{
+  return SubString(subString) += subString;
+}
+
+
+/**
+ * @brief append operator.
+ * @param subString append subString to this SubString.
+ * @returns this substring appended with subString
+ */
+SubString& SubString::operator+=(const SubString& subString)
+{
+  for (unsigned int i = 0; i < subString.size(); i++)
+    this->strings.push_back(subString[i]);
+}
+
+
+/**
+ * @brief Split the String at
+ * @param string where to split
+ * @param splitter delimiter.
+ */
 unsigned int SubString::split(const std::string& string, char splitter)
 {
@@ -83,5 +171,5 @@
 
 /**
- * Splits a String into a Substring removing all whiteSpaces
+ * @brief Splits a String into a Substring removing all whiteSpaces
  * @param string the String to Split
  * @param whiteSpaces MUST BE __TRUE__
@@ -96,4 +184,13 @@
 }
 
+
+/**
+ * @brief Splits a String into multiple splitters.
+ * @param string the String to split
+ * @param splitters multiple set of characters at what to split. (delimiters)
+ * @param escapeChar The Escape Character that overrides splitters commends and so on...
+ * @param safemode_char within these characters splitting won't happen
+ * @param comment_char the Comment character.
+ */
 unsigned int SubString::split(const std::string& string, const std::string& splitters, char escapeChar,char safemode_char, char comment_char)
 {
@@ -103,4 +200,66 @@
                        string, splitters, escapeChar, safemode_char);
   return strings.size();
+}
+
+
+/**
+ * @brief joins together all Strings of this Substring.
+ * @param delimiter the String between the subStrings.
+ * @returns the joined String.
+ */
+std::string SubString::join(const std::string& delimiter) const
+{
+  if (!this->strings.empty())
+  {
+    std::string retVal = this->strings[0];
+    for (unsigned int i = 0; i < this->strings.size(); i++)
+      retVal += delimiter + this->strings[i];
+    return retVal;
+  }
+  else
+    return SubString::emptyString;
+}
+
+
+/**
+ * @brief creates a SubSet of a SubString.
+ * @param subSetBegin the beginning to the end
+ * @returns the SubSet
+ *
+ * This function is added for your convenience, and does the same as
+ * SubString::SubString(const SubString& subString, unsigned int subSetBegin)
+ */
+SubString SubString::getSubSet(unsigned int subSetBegin) const
+{
+  return SubString(*this, subSetBegin);
+}
+
+
+/**
+ * @brief creates a SubSet of a SubString.
+ * @param subSetBegin the beginning to
+ * @param subSetEnd the end of the SubSet to select (if bigger than subString.size() it will be downset.)
+ * @returns the SubSet
+ *
+ * This function is added for your convenience, and does the same as
+ * SubString::SubString(const SubString& subString, unsigned int subSetBegin)
+ */
+SubString SubString::getSubSet(unsigned int subSetBegin, unsigned int subSetEnd) const
+{
+  return SubString(*this, subSetBegin, subSetEnd);
+}
+
+
+/**
+ * @brief get a particular substring's offset
+ * @param i the ID of the substring to get the offset from
+ * @returns the offset or NULL if an invalid ID was given
+ */
+unsigned int SubString::getOffset(unsigned int i) const
+{
+  if( i < this->offsets.size() && i >= 0)
+    return this->offsets[i];
+  else
+    return 0;
 }
 
@@ -119,4 +278,5 @@
  * @returns SPLIT_LINE_STATE the parser was in when returning
  *
+ * This is the Actual Splitting Algorithm from Clemens Wacha
  * Supports delimiters, escape characters,
  * ignores special  characters between safemode_char and between comment_char and linend '\n'.
@@ -142,99 +302,99 @@
     switch(state)
     {
-    case SL_NORMAL:
-      if(line[i] == escape_char)
-      {
-        state = SL_ESCAPE;
-      }
-      else if(line[i] == safemode_char)
-      {
+      case SL_NORMAL:
+        if(line[i] == escape_char)
+        {
+          state = SL_ESCAPE;
+        }
+        else if(line[i] == safemode_char)
+        {
+          state = SL_SAFEMODE;
+        }
+        else if(line[i] == comment_char)
+        {
+          /// FINISH
+          if(token.size() > 0)
+          {
+            ret.push_back(token);
+            offsets.push_back(i);
+            token.clear();
+          }
+          token += line[i];       // EAT
+          state = SL_COMMENT;
+        }
+        else if(delimiters.find(line[i]) != std::string::npos)
+        {
+          // line[i] is a delimiter
+          /// FINISH
+          if(token.size() > 0)
+          {
+            ret.push_back(token);
+            offsets.push_back(i);
+            token.clear();
+          }
+        }
+        else
+        {
+          token += line[i];       // EAT
+        }
+        break;
+      case SL_ESCAPE:
+        if(line[i] == 'n') token += '\n';
+        else if(line[i] == 't') token += '\t';
+        else if(line[i] == 'v') token += '\v';
+        else if(line[i] == 'b') token += '\b';
+        else if(line[i] == 'r') token += '\r';
+        else if(line[i] == 'f') token += '\f';
+        else if(line[i] == 'a') token += '\a';
+        else if(line[i] == '?') token += '\?';
+        else token += line[i];  // EAT
+        state = SL_NORMAL;
+        break;
+      case SL_SAFEMODE:
+        if(line[i] == safemode_char)
+        {
+          state = SL_NORMAL;
+        }
+        else if(line[i] == escape_char)
+        {
+          state = SL_SAFEESCAPE;
+        }
+        else
+        {
+          token += line[i];       // EAT
+        }
+        break;
+      case SL_SAFEESCAPE:
+        if(line[i] == 'n') token += '\n';
+        else if(line[i] == 't') token += '\t';
+        else if(line[i] == 'v') token += '\v';
+        else if(line[i] == 'b') token += '\b';
+        else if(line[i] == 'r') token += '\r';
+        else if(line[i] == 'f') token += '\f';
+        else if(line[i] == 'a') token += '\a';
+        else if(line[i] == '?') token += '\?';
+        else token += line[i];  // EAT
         state = SL_SAFEMODE;
-      }
-      else if(line[i] == comment_char)
-      {
-        /// FINISH
-        if(token.size() > 0)
-        {
-          ret.push_back(token);
-          offsets.push_back(i);
-          token.clear();
-        }
-        token += line[i];       // EAT
-        state = SL_COMMENT;
-      }
-      else if(delimiters.find(line[i]) != std::string::npos)
-      {
-        // line[i] is a delimiter
-        /// FINISH
-        if(token.size() > 0)
-        {
-          ret.push_back(token);
-          offsets.push_back(i);
-          token.clear();
-        }
-      }
-      else
-      {
-        token += line[i];       // EAT
-      }
-      break;
-    case SL_ESCAPE:
-      if(line[i] == 'n') token += '\n';
-      else if(line[i] == 't') token += '\t';
-      else if(line[i] == 'v') token += '\v';
-      else if(line[i] == 'b') token += '\b';
-      else if(line[i] == 'r') token += '\r';
-      else if(line[i] == 'f') token += '\f';
-      else if(line[i] == 'a') token += '\a';
-      else if(line[i] == '?') token += '\?';
-      else token += line[i];  // EAT
-      state = SL_NORMAL;
-      break;
-    case SL_SAFEMODE:
-      if(line[i] == safemode_char)
-      {
-        state = SL_NORMAL;
-      }
-      else if(line[i] == escape_char)
-      {
-        state = SL_SAFEESCAPE;
-      }
-      else
-      {
-        token += line[i];       // EAT
-      }
-      break;
-    case SL_SAFEESCAPE:
-      if(line[i] == 'n') token += '\n';
-      else if(line[i] == 't') token += '\t';
-      else if(line[i] == 'v') token += '\v';
-      else if(line[i] == 'b') token += '\b';
-      else if(line[i] == 'r') token += '\r';
-      else if(line[i] == 'f') token += '\f';
-      else if(line[i] == 'a') token += '\a';
-      else if(line[i] == '?') token += '\?';
-      else token += line[i];  // EAT
-      state = SL_SAFEMODE;
-      break;
-    case SL_COMMENT:
-      if(line[i] == '\n')
-      {
-        /// FINISH
-        if(token.size() > 0)
-        {
-          ret.push_back(token);
-          offsets.push_back(i);
-          token.clear();
-        }
-        state = SL_NORMAL;
-      }
-      else
-      {
-        token += line[i];       // EAT
-      }
-      break;
-    default:
-      // nothing
-      break;
+        break;
+      case SL_COMMENT:
+        if(line[i] == '\n')
+        {
+          /// FINISH
+          if(token.size() > 0)
+          {
+            ret.push_back(token);
+            offsets.push_back(i);
+            token.clear();
+          }
+          state = SL_NORMAL;
+        }
+        else
+        {
+          token += line[i];       // EAT
+        }
+        break;
+      default:
+        // nothing
+        break;
     }
     i++;
@@ -251,25 +411,7 @@
 }
 
-/**
- *  removes the object from memory
-*/
-SubString::~SubString()
-{ }
-
-/**
- * get a particular substring's offset
- * @param i the ID of the substring to get the offset from
- * @returns the offset or NULL if an invalid ID was given
- */
-unsigned int SubString::getOffset(unsigned int i)
-{
-  if( i < this->offsets.size() && i >= 0)
-    return this->offsets[i];
-  else
-    return 0;
-}
-
-/**
- * Some nice debug information about this SubString
+
+/**
+ * @brief Some nice debug information about this SubString
  */
 void SubString::debug() const
Index: /trunk/src/lib/util/substring.h
===================================================================
--- /trunk/src/lib/util/substring.h	(revision 7318)
+++ /trunk/src/lib/util/substring.h	(revision 7319)
@@ -10,42 +10,69 @@
 #include <string>
 
-  typedef enum {
-    SL_NORMAL,
-    SL_ESCAPE,
-    SL_SAFEMODE,
-    SL_SAFEESCAPE,
-    SL_COMMENT,
-  } SPLIT_LINE_STATE;
+typedef enum {
+  SL_NORMAL,
+  SL_ESCAPE,
+  SL_SAFEMODE,
+  SL_SAFEESCAPE,
+  SL_COMMENT,
+} SPLIT_LINE_STATE;
 
 //! A class that can load one string and split it in multipe ones
+/**
+ * SubString is a very Powerfull way to create a SubSet from a String
+ * It can be used, to Split strings append them and join them again.
+ */
 class SubString
 {
- public:
+public:
   SubString(const std::string& string = "", char splitter = ',');
   SubString(const std::string& string, bool whiteSpaces);
   SubString(const std::string& string, const std::string& splitters, char escapeChar ='\\', char safemode_char = '"', char comment_char = '\0');
+  /** @brief create a Substring as a copy of another one. @param subString the SubString to copy. */
+  SubString(const SubString& subString) { *this = subString; };
+  SubString(const SubString& subString, unsigned int subSetBegin);
+  SubString(const SubString& subString, unsigned int subSetBegin, unsigned int subSetEnd);
   ~SubString();
 
+  // operate on the SubString
+  SubString& operator=(const SubString& subString);
+  bool operator==(const SubString& subString);
+  SubString operator+(const SubString& subString) const;
+  SubString& operator+=(const SubString& subString);
+  /** @param subString the String to append @returns appended String. @brief added for convenience */
+  SubString& append(const SubString subString) { return (*this += subString); };
+
+  /////////////////////////////////////////
+  // Split and Join the any String. ///////
   unsigned int split(const std::string& string = "", char splitter = ',');
   unsigned int split(const std::string& string, bool whiteSpaces);
   unsigned int split(const std::string& string, const std::string& splitters, char escapeChar ='\\', char safemode_char = '"', char comment_char = '\0');
+  std::string join(const std::string& delimiter) const;
+  ////////////////////////////////////////
 
-  inline unsigned int getCount() { return this->strings.size(); };
-  const std::string& getString(unsigned int i) { return (i < this->strings.size()) ? this->strings[i] : emptyString; }; // safety-precaution
-  const std::string& operator[](unsigned int i) { return this->getString(i); };
-  unsigned int getOffset(unsigned int i);
+  // retrieve a SubSet from the String
+  SubString getSubSet(unsigned int subSetBegin) const;
+  SubString getSubSet(unsigned int subSetBegin, unsigned int subSetEnd) const;
 
+  // retrieve Information from within
+  inline unsigned int size() const { return this->strings.size(); };
+const std::string& getString(unsigned int i) const { return (i < this->strings.size()) ? this->strings[i] : emptyString; }
+  ; // safety-precaution
+  const std::string& operator[](unsigned int i) const { return this->getString(i); };
+  unsigned int getOffset(unsigned int i) const;
+
+  // the almighty algorithm.
   static SPLIT_LINE_STATE splitLine(std::vector<std::string>& ret,std::vector<unsigned int>& offsets,
                                     const std::string& line, const std::string& delimiters = " \t\r\n",
                                     char escape_char = '\\', char safemode_char = '"', char comment_char = '\0',
                                     SPLIT_LINE_STATE start_state = SL_NORMAL);
-
+  // debugging.
   void debug() const;
 
- private:
-   std::vector<std::string>  strings;                      //!< strings produced from a single string splitted in multiple strings
-   std::vector<unsigned int> offsets;                      //!< offsets of the beginning of the input-string to the beginning of each substring.
+private:
+  std::vector<std::string>  strings;                      //!< strings produced from a single string splitted in multiple strings
+  std::vector<unsigned int> offsets;                      //!< offsets of the beginning of the input-string to the beginning of each substring.
 
-   static const std::string emptyString;
+  static const std::string emptyString;
 };
 
