         //TODO: how to ensure that typing is consistent?
         // return [fnParse -> Any, fnCast -> MDLType] // this may work
         
-        // yes, the design's a bit convoluted, but allows great flexability!
+        // yes, the design's a bit convoluted, but allows great flexibility!
         // - note: with great flexibility, comes great responsibility!!
         //   - this is true, both from a performance aspect (reference retention) 
         // - as well as from a security aspect (arbitrary execution from remote XML)

        //   - that closure will get the node anyways
        // - same thing with options: beware retaining a reference
        
        parser.register(SpectraXMLNodeParser.self, name: SpectraXMLNodeType.World.rawValue) { (r, k: String, node: XMLNode, options: [String:AnyObject]) in
            return SpectraXMLNodeType.World.nodeParser(node, key: k, options: options)!
        }
        
        parser.register(SpectraXMLNodeParser.self, name: SpectraXMLNodeType.VertexAttribute.rawValue) { (r, k: String, node: XMLNode, options: [String:AnyObject]) in
            return SpectraXMLNodeType.VertexAttribute.nodeParser(node, key: k, options: options)!
        }
        
        return parser
    }

    public func parse(container: Container, options: [String: AnyObject] = [:]) {
        for child in xml!.root!.children {
            let (tag, key) = (child.tag!, child.attributes["key"])

            let nodeParser = self.parser.resolve(SpectraXMLNodeParser.self, arguments: (tag, key, child, options))!
            nodeParser(container: container, node: child, key: key, options: options)
        }
    }
}
