<!-- ##### SECTION Title ##### -->
MateComponentMonikerExtender

<!-- ##### SECTION Short_Description ##### -->
A way to extend arbitary monikers

<!-- ##### SECTION Long_Description ##### -->
<para>
A moniker extender is used to extend the functionality of a moniker.
There are two standard moniker extenders that cannot be system wide,
since they use the oaf database to expand the scope of a moniker to
arbitrarily many interfaces. These are invoked explicitely by monikers
implementing the stream interface in the following way:
  <example>
     <title>Explicit Stream extender usage example</title>
     <programlisting>
MateComponent_Unknown
example_moniker_resolve (MateComponentMoniker               *moniker,
			 const MateComponent_ResolveOptions *options,
			 const CORBA_char            *requested_interface,
			 CORBA_Environment           *ev)
{
	if (!strcmp (requested_interface, "IDL:MateComponent/Stream:1.0"))
		return handle_stream (moniker, options, ev);
	else
		return matecomponent_moniker_use_extender (
			"OAFIID:MateComponent_MonikerExtender_stream",
			moniker, options, requested_interface, ev);
}
     </programlisting>
  </example>
  The moniker extender essentialy resolves 'moniker' against stream
and by some means ( not known when the moniker was written ) converts
this to a new exotic interface - via. the PersistStream interface.
</para>

<para>
All standard moniker extenders are registered by adding a fragment
like this:
  <example>
    <title>Oaf information for an extender</title>
    <programlisting>
&lt;oaf_attribute name="matecomponent:moniker_extender" type="stringv"&gt;
	&lt;item value="file:"/&gt;
&lt;/oaf_attribute&gt;
    </programlisting>
  </example>
to the .oaf file. This registers the extender with the system, such
that when a moniker resolve fails an extender can be found for any
of the monikers with prefix specified in the "matecomponent:moniker_extender"
stringv.
</para>

<para>
Implementing your own extender is extremely simple, much like
#MateComponentMonikerSimple.
  <example>
    <title>Oaf information for an extender</title>
    <programlisting>
MateComponent_Unknown
example_extender_resolve (MateComponentMonikerExtender *extender,
			  const MateComponent_Moniker   m,
			  const MateComponent_ResolveOptions *options,
			  const CORBA_char      *display_name,
			  const CORBA_char      *requested_interface,
			  CORBA_Environment     *ev)
{
	... resolve 'm' against an interface we know it supports ...
	... then use that interface to provide requested_interface ...
}
    </programlisting>
  </example>
It is registered again in much the same way in your factory:
  <example>
    <title>Creating a new simple moniker</title>
    <programlisting>
static MateComponentObject *
matecomponent_std_moniker_factory (MateComponentGenericFactory *this,
			    const char           *object_id,
			    void                 *data)
{
	g_return_val_if_fail (object_id != NULL, NULL);

	if (!strcmp (object_id, "OAFIID:MateComponent_MonikerExtender_file"))
		return MATECOMPONENT_OBJECT (matecomponent_moniker_extender_new (
			example_extender_resolve, NULL));
	else
		return NULL;
}
    </programlisting>
  </example>
</para>

<!-- ##### SECTION See_Also ##### -->
<para>

</para>

<!-- ##### SECTION Stability_Level ##### -->


<!-- ##### SECTION Image ##### -->


<!-- ##### STRUCT MateComponentMonikerExtender ##### -->
<para>
Implements a moniker extender: MateComponent::MonikerExtender.
</para>


<!-- ##### STRUCT MateComponentMonikerExtenderClass ##### -->
<para>
MateComponentMonikerExtender's class.
</para>

@parent_class: 
@epv: 
@resolve: 

<!-- ##### USER_FUNCTION MateComponentMonikerExtenderFn ##### -->
<para>
Moniker resolution callback function.
</para>

@extender: extender (self)
@parent: parent moniker
@options: resolve options
@display_name: ? FIXME
@requested_interface: ? FIXME
@ev: 
@Returns: the resolution resulting object


<!-- ##### FUNCTION matecomponent_moniker_extender_new ##### -->
<para>

</para>

@resolve: 
@data: 
@Returns: 


<!-- ##### FUNCTION matecomponent_moniker_find_extender ##### -->
<para>

</para>

@name: 
@interface: 
@opt_ev: 
@Returns: 


<!-- ##### FUNCTION matecomponent_moniker_use_extender ##### -->
<para>

</para>

@extender_oafiid: 
@moniker: 
@options: 
@requested_interface: 
@opt_ev: 
@Returns: 


