Vous est-il arrivé de souhaiter modifier/adapter une fonction d’API de ShiVa ? Oui ?! moi aussi !
Cas concrêt : nous souhaitons adapter une fonction existante : xml.send, pour y inclure un log automatique à chaque appel.
Si l’on se fie à la documentation officielle, nous aurions procédé comme suit :
xml.send ( hXML, sURI )
log.message ( "L'envoi d'un xml à l'adresse ", sURI, " a débuté." )
Mais, la ligne de log devra être présente après la fonction xml.send à chaque fois qu’elle est employée. Cela peut être franchement gonflant de copier cette ligne autant de fois dans votre programme…
La solution vise à copier au runtime la fonction d’API dans une fonction temporaire, puis de l’appeller dans une seconde fonction et la substituer à la fonction d’API :
// fonction vide destinée à mémoriser la fonction intacte
------------------------------------------------------
function MyAIM.original_xml_send ( hXML, sURI )
------------------------------------------------------
------------------------------------------------------
end
------------------------------------------------------
// fonction applelant la fonction originale avec une partie supplémentaire :
------------------------------------------------------
function MyAIM.override_xml_send ( hXML, sURI )
------------------------------------------------------
// appel à la fonction originale
local bOK = MyAIM.original_xml_send ( hXML, sURI )
// partie ajoutée : ici un message dans le log.
log.message ( "L'envoi d'un xml à l'adresse ", sURI, " a débuté." )
return bOK
------------------------------------------------------
end
------------------------------------------------------
// Ensuite, pour remplacer votre fonction par la fonction surchargée, procédez de cette manière, dans le onInit d une AIM :
MyAIM.original_xml_send = xml.send
xml.send = MyAIM.override_xml_send
Vous verrez à la compilation, une vilaine erreur… Car cette méthode est incompatible avec un export C++, mais pour tout autre export cela semble fonctionner…
A bientôt pour de nouvelles aventures ShiVaesques !
EDIT : For english people, you can read the english version (translated by Felix Caffier) : http://www.shiva-engine.com/wiki/general-tutorials/lua-function-overloading/