La idea es que uses una variable temporal, para almacenar el objeto... ejemplo:
private p_Plugin as object ' esta variable almacena temporalmente el objeto
' La función que devuelve el objeto
public Function Plugin(byref Nombre as string) as object
' ..... esto representa el código interno que sea, o tengas dentro de la función
Set Plugin = loqueseaelresultado
end Function
' Ahora tu llamada sería:
Set p_plugin= plugin("Tooltip")
if (not (p_plugin isNothing)) then
call p_plugin.AddTooltip(param1, param2,param3, param4,etc...)
end if
'Ahora bien, si siempre haces esto, cuando creas el plugin, estas líneas podrían ir dentro de la propia función y aquella no precisaría devolver ningún objeto
Ahora bien, si lo llamas muchas veces, entonces lo mejor es embeberlo en una función o en una propiedad...
private p_Plugin as object
Mejor que poner 'as Object', es poner el tipo concreto de objeto que es, si se conoce y si siempre es el mismo... (gana en velocitad, porque el enlace se establece desde compilación, si no debe verificarse cada vez en tiempo de ejecución...
Si los objetos son distintos cada vez, pero todos implementan una interfaz (a juzgar por el 'AddToolTip', entonces decláralo como ese tipo que implementa, por ejemplo:
private p_PluginAddTT as IToolTip
' 'as ItoolTip', dado el supuesto que los objetos implementen un hipotético objeto llamado IToolTip
Creando Una propiedad pública para lectura y escritura
public property get PluginTT as object
Set PluginTT = p_Plugin
end property
Public property Set PluginTT(byref Nombre as string)
Set p_plugin= Plugin(nombre)
If (not (p_plugin isNothing)) then
call p_plugin.AddTooltip(param1, param2,param3, param4,etc...)
' OJO: Se supone que los parámetros son siempre los mismos, si son diferentes, deberían ser pasados también a la propiedad...
' pero en ese caso ya sería mejor que fuera una sub/function. Al final te pongo un ejemplo para este caso
end if
End Property
Y ahora cada vez que tengas que invocarlo (dentro del mismo módulo) tu escribes:
PluginTT= "Tooltip" ' si es desde otro módulo, obviamente tendrías que usar la instancia delante de la propiedad.
' y si necesitas obtener el plugin, para invocar alguna otra cosa, harías
dim x as object
set x= Plugin
if (not (x is nothing) then
x.invocarloquesea
end if
Naturalmente si lo usas dentro del mismo objeto... en este caso espreferible partir de la referencia temporal del objeto 'p_Plugin'.
La lectura del objeto, está más bien pensada para usarse desde fuera del módulo, si no se usa desde fuera, incluso sería innecesaria y bastaría que la propiedad fuera de solo escritura (no de lectura).
Y dado que es una variable interna, hay que destruirla cuando el objeto que lo contiene finaliza... supongamos que se usa desde dentro de una clase (form o usercontrol según el caso):
private Sub Class_Terminate ' Form_Terminate, Usercontrol_Terminate
Set p_Plugin = Nothing
end Sub
Ejemplo cuando debes pasar cada vez los parámetros porque varían de una vez a otra (y no se conoce su valor desde dentro de la propiedad), en cuyo caso es mejor despreciar la propiedad y usar una función...
Public function AddPlugin(byref Nombre as string, byval Param1 as..., byval Param2 as ... byval param3 as ..., byval param4 as ..., etc) as boolean ' usar byval o byref, según convenga al tipo de datos y según se quiera proteger...
dim plg as object
' CREAMOS el objeto plugin
Set plg= Plugin(nombre)
If (not(plg IsNothing)) then
plg.AddToolTip(param1, param2,param3,param4)
AddPlugin=True
End If
' set plg= nothing ' OJO: Se usa para una sola cosa y luego ya no se necesita?= se destruye, si no hay que conservar el objeto y destruirlo cuando ya no se necesite... por ejemplo usando p_Plugin, en dex de el 'plg' declarado en esta función...
end Funcion
' Y la llamada sería (con test del resultado, por eso la función devuelve un boolean, con True, si fue exitoso...:
dim añadido as boolean
dim nombre as string
nombre= "ToolTip"
añadido= AddPlugin(Nombre, param1, param2, param3, param4, etc...)
If (añadido=True) then
msgbox "el plugin " & nombre & " fue añadido con éxito..."
else
msgbox "el plugin & nombre & " falló al tratar de añadirse..."
end if
Date cuenta que esta última función es similar, a la que crea el objeto... es Decir, si la función que crea el objeto también está en el mismo módulo, el código de ambas podrían ser una y la misma función 'AddPlugin' que se acaba de mostrar y devolver si o si, un valor booleano, indicando si se creó y añadió el 'tooltip'... el código de la función que crea el plugin, debiera ir entoncen remplazando la línea que sigue a: ' CREAMOS el objeto plugin en la función AddPlugin.
Espero que puedas entenderlo bien, es realmente sencillo...