             classInitializer.initializeClass()
         }
 
-        //print(self)
-    }
-    
+        print(self)
+    }
+
+    private func analyzeProperty(name : String, value: Any, index : Int, overallIndex : Int) -> AttributeDescriptor {
+        let mirror : Mirror  = Mirror(reflecting: value)
+        var type = mirror.subjectType
+        var optional = false
+        var elementType : Any.Type? = nil
+        var factory : Factory = {fatalError("no factory implemented")}
+
+        // what the hell?
+
+        if let optionalType = value as? OptionalType {
+            type = optionalType.wrappedType()
+            optional = true
+        }
+
+        if let array = value as? ArrayType {
+            elementType = array.elementType()
+            factory = array.factory()
+        }
+
+        return AttributeDescriptor(bean: self, name: name, index: index, overallIndex: overallIndex, type: type, elementType: elementType, factory: factory, optional: optional)
+    }
+
     // MARK: public
     
     public func getBeanClass() -> AnyClass {
         return clazz
+    }
+
+    public func getSuperBean() -> BeanDescriptor? {
+        return superBean
+    }
+
+    public func getSubBeans() -> [BeanDescriptor] {
+        return directSubBeans
     }
     
     public func create() throws -> AnyObject {

    
    private static var beans = IdentityMap<AnyObject, BeanDescriptor>();

    private static var SWIFT_OBJECT_CLASS : AnyClass = try! Classes.class4Name("SwiftObject")
    
    // MARK: class methods
    
    ///Return the
    /// - Parameter clazz: the corresponding class
    ///
    /// - Returns: the `BeanDescriptor` instance for the particular class
    public class func forClass(clazz: AnyClass) throws -> BeanDescriptor {
        if let bean = beans[clazz] {
            return bean;
        }
        else {
            let bean = BeanDescriptor(clazz: clazz);
            
            beans[clazz] = bean;
            
            try bean.analyze()
            
            return bean;
        }
    }
    
    public class func forClass(clazz: String) throws -> BeanDescriptor {
        return try forClass(try Classes.class4Name(clazz))
    }
    
    // MARK: inner classes
    
    public class PropertyDescriptor : CustomStringConvertible {

            return type;
        }

        public func isOptional() -> Bool {
            return optional
        }

        public func getBean() -> BeanDescriptor {
            return bean
        }
