    {- |
    Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
    License    : LGPL-2.1
    Maintainer : Iñaki García Etxebarria (garetxe@gmail.com)

    /No description available in the introspection data./
    -}

    #define ENABLE_OVERLOADING \
           (!defined(__HADDOCK_VERSION__))

    module GI.Atk.Structs.Implementor
        (

    -- * Exported types
        Implementor(..)                         ,
        noImplementor                           ,

     -- * Methods
    -- ** refAccessible #method:refAccessible#

    #if ENABLE_OVERLOADING
        ImplementorRefAccessibleMethodInfo      ,
    #endif
        implementorRefAccessible                ,

        ) where

    import Data.GI.Base.ShortPrelude
    import qualified Data.GI.Base.ShortPrelude as SP
    import qualified Data.GI.Base.Overloading as O
    import qualified Prelude as P

    import qualified Data.GI.Base.Attributes as GI.Attributes
    import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
    import qualified Data.GI.Base.GError as B.GError
    import qualified Data.GI.Base.GVariant as B.GVariant
    import qualified Data.GI.Base.GValue as B.GValue
    import qualified Data.GI.Base.GParamSpec as B.GParamSpec
    import qualified Data.GI.Base.CallStack as B.CallStack
    import qualified Data.Text as T
    import qualified Data.ByteString.Char8 as B
    import qualified Data.Map as Map
    import qualified Foreign.Ptr as FP

    import {-# SOURCE #-} qualified GI.Atk.Objects.Object as Atk.Object

    -- | Memory-managed wrapper type.
    newtype Implementor = Implementor (ManagedPtr Implementor)
    -- XXX Wrapping a foreign struct/union with no known destructor or size, leak?
    instance WrappedPtr Implementor where
        wrappedPtrCalloc = return nullPtr
        wrappedPtrCopy = return
        wrappedPtrFree = Nothing

    -- | A convenience alias for `Nothing` :: `Maybe` `Implementor`.
    noImplementor :: Maybe Implementor
    noImplementor = Nothing

    #if ENABLE_OVERLOADING
    instance O.HasAttributeList Implementor
    type instance O.AttributeList Implementor = ImplementorAttributeList
    type ImplementorAttributeList = ('[ ] :: [(Symbol, *)])
    #endif

    -- method Implementor::ref_accessible
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "implementor", argType = TInterface (Name {namespace = "Atk", name = "Implementor"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "The #GObject instance which should implement #AtkImplementorIface\nif a non-null return value is required.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
    -- Lengths : []
    -- returnType : Just (TInterface (Name {namespace = "Atk", name = "Object"}))
    -- throws : False
    -- Skip return : False

    foreign import ccall "atk_implementor_ref_accessible" atk_implementor_ref_accessible ::
        Ptr Implementor ->                      -- implementor : TInterface (Name {namespace = "Atk", name = "Implementor"})
        IO (Ptr Atk.Object.Object)

    {- |
    Gets a reference to an object\'s 'GI.Atk.Objects.Object.Object' implementation, if
    the object implements @/AtkObjectIface/@
    -}
    implementorRefAccessible ::
        (B.CallStack.HasCallStack, MonadIO m) =>
        Implementor
        {- ^ /@implementor@/: The 'GI.GObject.Objects.Object.Object' instance which should implement 'GI.Atk.Interfaces.ImplementorIface.ImplementorIface'
    if a non-null return value is required. -}
        -> m Atk.Object.Object
        {- ^ __Returns:__ a reference to an object\'s 'GI.Atk.Objects.Object.Object'
    implementation -}
    implementorRefAccessible implementor = liftIO $ do
        implementor' <- unsafeManagedPtrGetPtr implementor
        result <- atk_implementor_ref_accessible implementor'
        checkUnexpectedReturnNULL "implementorRefAccessible" result
        result' <- (wrapObject Atk.Object.Object) result
        touchManagedPtr implementor
        return result'

    #if ENABLE_OVERLOADING
    data ImplementorRefAccessibleMethodInfo
    instance (signature ~ (m Atk.Object.Object), MonadIO m) => O.MethodInfo ImplementorRefAccessibleMethodInfo Implementor signature where
        overloadedMethod _ = implementorRefAccessible

    #endif

    #if ENABLE_OVERLOADING
    type family ResolveImplementorMethod (t :: Symbol) (o :: *) :: * where
        ResolveImplementorMethod "refAccessible" o = ImplementorRefAccessibleMethodInfo
        ResolveImplementorMethod l o = O.MethodResolutionFailed l o

    instance (info ~ ResolveImplementorMethod t Implementor, O.MethodInfo info Implementor p) => O.IsLabelProxy t (Implementor -> p) where
        fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

    #if MIN_VERSION_base(4,9,0)
    instance (info ~ ResolveImplementorMethod t Implementor, O.MethodInfo info Implementor p) => O.IsLabel t (Implementor -> p) where
    #if MIN_VERSION_base(4,10,0)
        fromLabel = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
    #else
        fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
    #endif
    #endif

    #endif