-            std::string name(line.substr(0, colon));
-            std::string value(line.substr(colon + 1));
-            while (!value.empty() && value[0] == ' ')
-                value = value.substr(1);
-
-            if (name == "Default-Icon")
-                defaultIcon_ = [[NSString stringWithUTF8String:value.c_str()] retain];
-            else if (name == "Description")
-                description_ = [[NSString stringWithUTF8String:value.c_str()] retain];
-            else if (name == "Label")
-                label_ = [[NSString stringWithUTF8String:value.c_str()] retain];
-            else if (name == "Origin")
-                origin_ = [[NSString stringWithUTF8String:value.c_str()] retain];
-            else if (name == "Support")
-                support_ = [[NSString stringWithUTF8String:value.c_str()] retain];
-            else if (name == "Version")
-                version_ = [[NSString stringWithUTF8String:value.c_str()] retain];
+        pkgTagSection section;
+        tags.Step(section);
+
+        struct {
+            const char *name_;
+            CYString *value_;
+        } names[] = {
+            {"default-icon", &defaultIcon_},
+            {"description", &description_},
+            {"label", &label_},
+            {"origin", &origin_},
+            {"support", &support_},
+            {"version", &version_},
+        };
+
+        for (size_t i(0); i != sizeof(names) / sizeof(names[0]); ++i) {
+            const char *start, *end;
+
+            if (section.Find(names[i].name_, start, end)) {
+                CYString &value(*names[i].value_);
+                value.set(pool, start, end - start);
+            }