<!-- ##### SECTION Title ##### -->
GTypePlugin

<!-- ##### SECTION Short_Description ##### -->
An interface for dynamically loadable types

<!-- ##### SECTION Long_Description ##### -->
<para>
The GObject type system supports dynamic loading of types. The #GTypePlugin 
interface is used to handle the lifecycle of dynamically loaded types. 
It goes as follows:
</para>
<para>
<orderedlist>
<listitem><para>
  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:
<literal>new_type_id = g_type_register_dynamic (parent_type_id,
                                                "TypeName",
                                                new_type_plugin,
                                                type_flags);
</literal>
  where <literal>new_type_plugin</literal> is an implementation of the
  #GTypePlugin interface.
</para></listitem>
<listitem><para>  
   The type's implementation is referenced, e.g. through
   g_type_class_ref() or through g_type_create_instance() (this is 
   being called by g_object_new()) or through one of the above done on 
   a type derived from <literal>new_type_id</literal>.
</para></listitem>
<listitem><para>  
   This causes the type system to load the type's implementation by calling
   g_type_plugin_use() and g_type_plugin_complete_type_info() on 
   <literal>new_type_plugin</literal>.
</para></listitem>
<listitem><para>  
   At some point the type's implementation isn't required anymore, e.g. after
   g_type_class_unref() or g_type_free_instance() (called when the reference
   count of an instance drops to zero).
</para></listitem>
<listitem><para>  
   This causes the type system to throw away the information retrieved from
   g_type_plugin_complete_type_info() and then it calls
   g_type_plugin_unuse() on <literal>new_type_plugin</literal>.
</para></listitem>
<listitem><para>  
   Things may repeat from the second step.
</para></listitem>
</orderedlist>
</para>
<para>
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 
g_type_plugin_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 g_type_plugin_use() 
and g_type_plugin_complete_type_info() again when the type is needed again.
</para>
<para>
#GTypeModule 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.
</para>

<!-- ##### SECTION See_Also ##### -->
<para>
#GTypeModule and g_type_register_dynamic().
</para>

<!-- ##### STRUCT GTypePlugin ##### -->
<para>
The <structname>GTypePlugin</structname> typedef is used as a placeholder 
for objects that implement the <structname>GTypePlugin</structname> 
interface.
</para>


<!-- ##### STRUCT GTypePluginClass ##### -->
<para>
The #GTypePlugin interface is used by the type system in order to handle
the lifecycle of dynamically loaded types.
</para>

@use_plugin: Increases the use count of the plugin.
@unuse_plugin: Decreases the use count of the plugin.
@complete_type_info: Fills in the #GTypeInfo and 
  #GTypeValueTable structs for the type. The structs are initialized
  with <literal>memset(s, 0, sizeof (s))</literal> before calling 
  this function.
@complete_interface_info: Fills in missing parts of the #GInterfaceInfo 
  for the interface. The structs is initialized with 
  <literal>memset(s, 0, sizeof (s))</literal> before calling
  this function.

<!-- ##### USER_FUNCTION GTypePluginUse ##### -->
<para>
The type of the @use_plugin function of #GTypePluginClass, which gets called
to increase the use count of @plugin.
</para>

@plugin: the #GTypePlugin whose use count should be increased


<!-- ##### USER_FUNCTION GTypePluginUnuse ##### -->
<para>
The type of the @unuse_plugin function of #GTypePluginClass.
</para>

@plugin: the #GTypePlugin whose use count should be decreased


<!-- ##### USER_FUNCTION GTypePluginCompleteTypeInfo ##### -->
<para>
The type of the @complete_type_info function of #GTypePluginClass.
</para>

@plugin: the #GTypePlugin
@g_type: the #GType whose info is completed
@info: the #GTypeInfo struct to fill in
@value_table: the #GTypeValueTable to fill in


<!-- ##### USER_FUNCTION GTypePluginCompleteInterfaceInfo ##### -->
<para>
The type of the @complete_interface_info function of #GTypePluginClass.
</para>

@plugin: the #GTypePlugin
@instance_type: the #GType of an instantiable type to which the interface
  is added
@interface_type: the #GType of the interface whose info is completed
@info: the #GInterfaceInfo to fill in


<!-- ##### FUNCTION g_type_plugin_use ##### -->
<para>
Calls the @use_plugin function from the #GTypePluginClass of @plugin.
There should be no need to use this function outside of the GObject 
type system itself.
</para>

@plugin: a #GTypePlugin


<!-- ##### FUNCTION g_type_plugin_unuse ##### -->
<para>
Calls the @unuse_plugin function from the #GTypePluginClass of @plugin.
There should be no need to use this function outside of the GObject 
type system itself.
</para>

@plugin: a #GTypePlugin


<!-- ##### FUNCTION g_type_plugin_complete_type_info ##### -->
<para>
Calls the @complete_type_info function from the #GTypePluginClass of @plugin.
There should be no need to use this function outside of the GObject 
type system itself.
</para>

@plugin: a #GTypePlugin
@g_type: the #GType whose info is completed
@info: the #GTypeInfo struct to fill in
@value_table: the #GTypeValueTable to fill in


<!-- ##### FUNCTION g_type_plugin_complete_interface_info ##### -->
<para>
Calls the @complete_interface_info function from the #GTypePluginClass 
of @plugin. There should be no need to use this function outside of the 
GObject type system itself.
</para>

@plugin: the #GTypePlugin
@instance_type: the #GType of an instantiable type to which the interface
  is added
@interface_type: the #GType of the interface whose info is completed
@info: the #GInterfaceInfo to fill in


