         case Tasks = "tasks"
         case Overlays = "overlays"
         case UseOverlays = "use-overlays"
+
+        static var allKeys: [Key] {
+            return [
+                    Name,
+                    Version,
+                    PackageTypeName,
+                    ImportPackages,
+                    Tasks,
+                    Overlays,
+                    UseOverlays
+            ]
+        }
     }
     
     // The required properties.

    }
    
    public init(type: ParseType, overlay requestedGlobalOverlays: [String], pathOnDisk: String) throws {
        if type.name != "package" { throw PackageError.NonPackage }
        self.importedPath = pathOnDisk

        if let value = type.properties[Keys.Name.rawValue]?.string { self.name = value }
        else {
            throw PackageError.NoName
        }
        if let value = type.properties[Keys.Version.rawValue]?.string { self.version = value }

        if let parsedTasks = type.properties[Keys.Tasks.rawValue]?.map {
            for (name, value) in parsedTasks {
                if let task = Task(value: value, unqualifiedName: name, package: self, importedPath: pathOnDisk) {
                    self.tasks[task.unqualifiedName] = task

            }

        }
        if let ol = type.properties[Key.Overlays.rawValue] {
            guard let overlays = ol.map else {
                fatalError("Non-map overlay \(ol)")
            }
