public function composite_properties()
 {
     $config = new Config();
     $config->append('util/cmd/unittest/add_etc');
     $config->append('util/cmd/unittest');
     $this->assertEquals('overwritten_value', $config->properties('debug')->readString('section', 'key'));
 }
 /**
  * Main method
  *
  * @param   util.cmd.ParamString params
  * @return  int
  */
 public function run(ParamString $params, Config $config = null)
 {
     // No arguments given - show our own usage
     if ($params->count < 1) {
         $this->selfUsage();
         return 1;
     }
     // Configure properties
     $config || ($config = new Config());
     // Separate runner options from class options
     for ($offset = 0, $i = 0; $i < $params->count; $i++) {
         switch ($params->list[$i]) {
             case '-c':
                 $config->append($params->list[$i + 1]);
                 $offset += 2;
                 $i++;
                 break;
             case '-cp':
                 ClassLoader::registerPath($params->list[$i + 1], null);
                 $offset += 2;
                 $i++;
                 break;
             case '-v':
                 $this->verbose = true;
                 $offset += 1;
                 $i++;
                 break;
             case '-?':
                 $this->selfUsage();
                 return 1;
             case '-l':
                 $this->listCommands();
                 return 1;
             default:
                 break 2;
         }
     }
     // Sanity check
     if (!$params->exists($offset)) {
         self::$err->writeLine('*** Missing classname');
         return 1;
     }
     // Use default path for config if no sources set
     if ($config->isEmpty()) {
         $config->append(is_dir(self::DEFAULT_CONFIG_PATH) ? self::DEFAULT_CONFIG_PATH : '.');
     }
     unset($params->list[-1]);
     $classparams = new ParamString(array_slice($params->list, $offset + 1));
     return $this->runCommand($params->value($offset), $classparams, $config);
 }