         return nil
     }
     
-    //extract property read-only attribute
+    /// extract property read-only attribute
     private static func extractPropertyAttributeReadOnly(from string: String) -> Bool {
         // read-only format: R
         if let char = string.characters.first, char == "R" {

        }
    }
    
    //convenience to get property key's according json key
    public func jsonKey(_ propertyKey: String) -> String {
        return type(of: self).jsonKey(propertyKey)
    }

        }
    }
    
    /// display property name and value friendly
    override open var description: String {
        let selfClass = type(of: self)
        var desc = "|\(selfClass)| "
        for info in selfClass.propertyInfos() {
            desc += ", "
            desc += info.propertyKey + ": "
            if let propertyValue = value(forKey: info.propertyKey) {
                desc += "\(propertyValue)"
            }
        }
        return desc
    }

    /// convert Model to JSON object
    open func json() -> [String: Any] {
        var dictionary = [String: Any]()
        for info in type(of: self).propertyInfos() {
