     }
     @inlinable deinit { ptr.deallocate() }
 
-    /// Convenience value constructor
-    ///
-    /// - Parameter v: value to initialise with
-    @inlinable convenience override public init<T>(_ v: T) {
+    /// Convenience, optional value constructor
+    /// - Note: The value container will be `unset` if the value is `nil`
+    /// - Parameter v: optional value to initialise with (or `unset` if `nil`)
+    @inlinable convenience override public init<T>(_ v: T?) {
         self.init()
         set(v)
     }

        if let v = o as? StaticString { set(v) ; return }
        if let v = o as? ValueBase { set(v) ; return }
        if let v = o as? ValueRef { set(v) ; return }
        if let v = o as? ValueProtocol { set(v) ; return }
        if let v = o as? Object { setObject(vObject: v) ; return }
        if let v = o as? ObjectRef { setObject(vObject: v) ; return }
        if let v = o as? ParamSpec { set(param: v) ; return }
        if let v = o as? ParamSpecRef { set(param: v) ; return }
        unset()
        g_warn_message("GLibObject", #file, #line, #function, "Cannot set \(o) of type \(O.self) as a Value")
    }

        let ptr = pointer
        return ptr.map { $0.assumingMemoryBound(to: T.self) }
    }
    /// Generic Value accessor for object types.
    /// - Warning: this method does not check whether the object actually conforms to the given object subtype.  If you want run time safety, you need to check the (meta)type of the returned reference!
    /// - Returns: the unwrapped value if conforming to object type or `nil`
    @inlinable func get<O: ObjectProtocol>() -> O? {
        if typeCheckValueHolds(type: .object)  { let o = object ; return o?.ptr.flatMap { O(raw: $0) } }
        return nil
    }
    /// Generic Value accessor for unknown types.
    ///
    /// - Returns: the unwrapped value if conforming to the given type or `nil`
    @inlinable func get<T>() -> T? {
        if typeCheckValueHolds(type: .boolean) { return boolean as? T }
        if typeCheckValueHolds(type: .string)  { return string  as? T }
