Copyright | Will Thompson and Iñaki García Etxebarria |
---|---|
License | LGPL-2.1 |
Maintainer | Iñaki García Etxebarria |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
An interface that handles the lifecycle of dynamically loaded types.
The GObject type system supports dynamic loading of types. It goes as follows:
- The type is initially introduced (usually upon loading the module
the first time, or by your main application that knows what modules
introduces what types), like this:
``
c new_type_id = g_type_register_dynamic (parent_type_id, "TypeName", new_type_plugin, type_flags);
`where
new_type_pluginis an implementation of the
GTypePlugin@ interface. - The type's implementation is referenced, e.g. through
[func@GObject.TypeClass.ref] or through [func@GObject.type_create_instance]
(this is being called by [ctor@GObject.Object.new]) or through one of the above
done on a type derived from
new_type_id
. - This causes the type system to load the type's implementation by calling
[method@GObject.TypePlugin.use] and [method@GObject.TypePlugin.complete_type_info]
on
new_type_plugin
. - At some point the type's implementation isn't required anymore, e.g. after [method@GObject.TypeClass.unref] or [func@GObject.type_free_instance] (called when the reference count of an instance drops to zero).
- This causes the type system to throw away the information retrieved
from [method@GObject.TypePlugin.complete_type_info] and then it calls
[method@GObject.TypePlugin.unuse] on
new_type_plugin
. - Things may repeat from the second step.
So basically, you need to implement a GTypePlugin
type that
carries a use_count, once use_count goes from zero to one, you need
to load the implementation to successfully handle the upcoming
[method@GObject.TypePlugin.complete_type_info] call. Later, maybe after
succeeding use/unuse calls, once use_count drops to zero, you can
unload the implementation again. The type system makes sure to call
[method@GObject.TypePlugin.use] and [method@GObject.TypePlugin.complete_type_info]
again when the type is needed again.
- class@GObject.TypeModule
- is an implementation of @GTypePlugin` that already implements most of this except for the actual module loading and unloading. It even handles multiple registered types per module.
Synopsis
- newtype TypePlugin = TypePlugin (ManagedPtr TypePlugin)
- class (ManagedPtrNewtype o, IsDescendantOf TypePlugin o) => IsTypePlugin o
- typePluginCompleteInterfaceInfo :: (HasCallStack, MonadIO m, IsTypePlugin a) => a -> GType -> GType -> InterfaceInfo -> m ()
- typePluginCompleteTypeInfo :: (HasCallStack, MonadIO m, IsTypePlugin a) => a -> GType -> TypeInfo -> TypeValueTable -> m ()
- typePluginUnuse :: (HasCallStack, MonadIO m, IsTypePlugin a) => a -> m ()
- typePluginUse :: (HasCallStack, MonadIO m, IsTypePlugin a) => a -> m ()
Exported types
newtype TypePlugin Source #
Memory-managed wrapper type.
TypePlugin (ManagedPtr TypePlugin) |
Instances
Eq TypePlugin Source # | |
Defined in GI.GObject.Interfaces.TypePlugin (==) :: TypePlugin -> TypePlugin -> Bool # (/=) :: TypePlugin -> TypePlugin -> Bool # | |
BoxedPtr TypePlugin Source # | |
Defined in GI.GObject.Interfaces.TypePlugin boxedPtrCopy :: TypePlugin -> IO TypePlugin boxedPtrFree :: TypePlugin -> IO () | |
ManagedPtrNewtype TypePlugin Source # | |
Defined in GI.GObject.Interfaces.TypePlugin toManagedPtr :: TypePlugin -> ManagedPtr TypePlugin |
class (ManagedPtrNewtype o, IsDescendantOf TypePlugin o) => IsTypePlugin o Source #
Type class for types which implement TypePlugin
.
Instances
(ManagedPtrNewtype o, IsDescendantOf TypePlugin o) => IsTypePlugin o Source # | |
Defined in GI.GObject.Interfaces.TypePlugin |
Methods
Click to display all available methods, including inherited ones
completeInterfaceInfo
typePluginCompleteInterfaceInfo Source #
:: (HasCallStack, MonadIO m, IsTypePlugin a) | |
=> a |
|
-> GType |
|
-> GType |
|
-> InterfaceInfo |
|
-> m () |
Calls the completeInterfaceInfo
function from the
GTypePluginClass
of plugin
. There should be no need to use this
function outside of the GObject type system itself.
completeTypeInfo
typePluginCompleteTypeInfo Source #
:: (HasCallStack, MonadIO m, IsTypePlugin a) | |
=> a |
|
-> GType |
|
-> TypeInfo |
|
-> TypeValueTable |
|
-> m () |
Calls the completeTypeInfo
function from the GTypePluginClass
of plugin
.
There should be no need to use this function outside of the GObject
type system itself.
unuse
:: (HasCallStack, MonadIO m, IsTypePlugin a) | |
=> a |
|
-> m () |
Calls the unusePlugin
function from the GTypePluginClass
of
plugin
. There should be no need to use this function outside of
the GObject type system itself.
use
:: (HasCallStack, MonadIO m, IsTypePlugin a) | |
=> a |
|
-> m () |
Calls the usePlugin
function from the GTypePluginClass
of
plugin
. There should be no need to use this function outside of
the GObject type system itself.