     // Type casting and conversion, reference:
     // https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html
 
-    // Cast Word value to specified Objective-C type (not support 32-bit)
-    private func bitCastWord(word: Word, toObjCType type: UnsafePointer<Int8>) -> Any? {
+    // Cast bits to specified Objective-C type
+    private func bitCast(buffer: UnsafePointer<Void>, toObjCType type: UnsafePointer<Int8>) -> Any? {
         switch Character(UnicodeScalar(UInt8(type[0]))) {
-        case "c": return CChar(truncatingBitPattern: word)
-        case "i": return CInt(truncatingBitPattern: word)
-        case "s": return CShort(truncatingBitPattern: word)
-        case "l": return Int32(truncatingBitPattern: word)
-        case "q": return CLongLong(word)
-        case "C": return CUnsignedChar(truncatingBitPattern: word)
-        case "I": return CUnsignedInt(truncatingBitPattern: word)
-        case "S": return CUnsignedShort(truncatingBitPattern: word)
-        case "L": return UInt32(truncatingBitPattern: word)
-        case "Q": return unsafeBitCast(word, CUnsignedLongLong.self)
-        case "f": return unsafeBitCast(UInt32(truncatingBitPattern: word), CFloat.self)
-        case "d": return unsafeBitCast(word, CDouble.self)
-        case "B": return unsafeBitCast(UInt8(truncatingBitPattern: word), CBool.self)
-        case "v": return unsafeBitCast(word, Void.self)
-        case "*": return unsafeBitCast(word, UnsafePointer<CChar>.self)
-        case "@": return word != 0 ? unsafeBitCast(word, AnyObject.self) : nil
-        case "#": return unsafeBitCast(word, AnyClass.self)
-        case ":": return unsafeBitCast(word, Selector.self)
-        case "^", "?": return unsafeBitCast(word, COpaquePointer.self)
+        case "c": return UnsafePointer<CChar>(buffer).memory
+        case "i": return UnsafePointer<CInt>(buffer).memory
+        case "s": return UnsafePointer<CShort>(buffer).memory
+        case "l": return UnsafePointer<Int32>(buffer).memory
+        case "q": return UnsafePointer<CLongLong>(buffer).memory
+        case "C": return UnsafePointer<CUnsignedChar>(buffer).memory
+        case "I": return UnsafePointer<CUnsignedInt>(buffer).memory
+        case "S": return UnsafePointer<CUnsignedShort>(buffer).memory
+        case "L": return UnsafePointer<UInt32>(buffer).memory
+        case "Q": return UnsafePointer<CUnsignedLongLong>(buffer).memory
+        case "f": return UnsafePointer<CFloat>(buffer).memory
+        case "d": return UnsafePointer<CDouble>(buffer).memory
+        case "B": return UnsafePointer<CBool>(buffer).memory
+        case "v": assertionFailure("Why cast to Void type?")
+        case "*": return UnsafePointer<CChar>(buffer)
+        case "@": return UnsafePointer<AnyObject!>(buffer).memory
+        case "#": return UnsafePointer<AnyClass!>(buffer).memory
+        case ":": return UnsafePointer<Selector>(buffer).memory
+        case "^", "?": return COpaquePointer(buffer)
         default:  assertionFailure("Unknown Objective-C type encoding '\(String(UTF8String: type))'")
         }
         return Void()

        case "d": return num?.doubleValue
        case "B": return num?.boolValue
        case "v": return Void()
        case "*": return (object as? String)?.nulTerminatedUTF8.withUnsafeBufferPointer({ COpaquePointer($0.baseAddress) })
        case ":": return object is String ? Selector(object as! String) : Selector()
        case "@": return object
        case "#": return object


    private func getterOfName(name: String) -> Selector {
        var getter = Selector()
        let property = class_getProperty(target.dynamicType, name)
        if property != nil {
            let attr = property_copyAttributeValue(property, "G")
            getter = Selector(attr == nil ? name : String(UTF8String: attr)!)
