     public func parse(container: Container, options: [String: AnyObject] = [:]) {
         for child in xml!.root!.children {
             let (tag, key) = (child.tag!, child.attributes["key"])
-            
-            switch SpectraXMLNodeType(rawValue: tag)! {
-            case .World: break
-            case .Camera: break
-            case .VertexDescriptor: break
-            case .VertexAttribute: break
-            default: break
-            }
+
+            let nodeParser = self.parser.resolve(SpectraXMLNodeParser.self, arguments: (tag, key, child, options))!
+            nodeParser(container: container, node: child, key: key, options: options)
         }
     }
 }

        //   - 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
    }

import Fuzi
import Swinject
import ModelIO

// should it be necessary to pass the key here?
public typealias SpectraXMLNodeParser = ((container: Container, node: XMLNode, key: String?, options: [String: AnyObject]) -> Any)

public enum SpectraXMLNodeType: String {
    case World = "world"
