     /// data type representing a function/method argument or return type
     public class Argument: CType {
         public override var kind: String { return "Argument" }
-        public let instance: Bool       ///< is this an instance parameter?
-        public let _varargs: Bool       ///< is this a varargs (...) parameter?
+        public let instance: Bool           ///< is this an instance parameter or return type?
+        public let _varargs: Bool           ///< is this a varargs (...) parameter?
+        public let isNullable: Bool         ///< is this a nullable parameter or return type?
+        public let isOptional: Bool         ///< is this an optional (out) parameter?
+        public let callerAllocates: Bool    ///< is this a caller-allocated (out) parameter?
+        public let ownershipTransfer: OwnershipTransfer ///< model of ownership transfer used
+        public let direction: ParameterDirection        ///< whether this is an `in`, `out`, or `inout` parameter
 
         /// indicate whether the given parameter is varargs
         public var varargs: Bool {

        /// - Parameters:
        ///   - node: `XMLElement` to construct this constant from
        ///   - index: Index within the siblings of the `node`
        public override init(node: XMLElement, at index: Int) {
            cname = node.attribute(named: "identifier") ?? ""
            let thrAttr = node.attribute(named: "throws") ?? "0"
            throwsError = (Int(thrAttr) ?? 0) != 0

    /// a function is the same as a method
    public class Function: Method {
        public override var kind: String { return "Function" }

        public override init(node: XMLElement, at index: Int) {
            super.init(node: node, at: index)
        }
    }

    /// a callback is the same as a function
