Index: XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_object_template.hpp
===================================================================
--- XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_object_template.hpp	(revision 104)
+++ XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_object_template.hpp	(revision 107)
@@ -1,4 +1,7 @@
 #ifndef __XMLIO_OBJECT_TEMPLATE__
-#define __XMLIO_OBJECT_TEMPLATE__ 
+#define __XMLIO_OBJECT_TEMPLATE__
+
+#include "declare_attribut.hpp"
+#include "attribut_registrar.hpp"
 
 // Classes utilisÃ©es issues de la STL
@@ -8,24 +11,48 @@
 
 using XMLIOSERVER::StrHashMap;
-   
+
+using XMLIOSERVER::XML::XMLNode;
+using XMLIOSERVER::XML::THashAttributes;
+
 namespace XMLIOSERVER
 {
    template <class T>
-      class ObjectTemplate : public AbstractObject
+      class ObjectTemplate : public AbstractObject, public virtual AttributRegistrar
    {
       public :
-         
-         static T& CreateObject(const string _id) throw (XMLIOUndefinedValueException) 
+
+
+         friend ostream& operator<< (ostream& out, const T& c)
+         {
+            const AttributRegistrar &ar = c;
+            if (c.hasChild())
+            {
+               out << IncIndent  << "<" << c.getName()   << c.printId() << ar << ">" << std::endl;
+               c.printChild(out); // << Ecriture des objets enfants ici.
+               out << NIndent    << "</" << c.getName()  << ">" << DecEndl;
+            }
+            else out << IncIndent << "<" << c.getName()  << c.printId() << ar << "/>" << DecEndl;
+
+            return (out);
+         }
+
+         string getName(void) const {return (T::GetName()); }
+
+         virtual bool hasChild(void) const { return (false); }
+         virtual void printChild(ostream& out) const { /* Ne rien faire de plus */ }
+         virtual void resolveDescInheritance(const AttributRegistrar* _parent = 0) { addAttributes(*_parent); }
+
+         static T& CreateObject(const string _id) throw (XMLIOUndefinedValueException)
          {
             // Si l'identifiant est rÃ©pertoriÃ©, on retourne l'Ã©lÃ©ment existant.
             if(ObjectTemplate<T>::HasObject(_id))
                return (ObjectTemplate<T>::GetObject(_id));
-                              
-            // Ajout d'un nouvel objet si l'identifiant n'est pas rÃ©pertoriÃ©.           
+
+            // Ajout d'un nouvel objet si l'identifiant n'est pas rÃ©pertoriÃ©.
             ObjectTemplate<T>::AllListObj[CurrContext].addObject(new T(_id));
-            
+
             return (ObjectTemplate<T>::GetObject(_id));
          }
-         
+
          static T& CreateObject(void)
          {
@@ -34,8 +61,8 @@
             return (*value);
          }
-         
+
          static T& GetObject(const string _id) throw (XMLIOUndefinedValueException)
          { return (*ObjectTemplate<T>::AllListObj[CurrContext][_id]); }
-         
+
          static bool HasObject(const string _id)
          {
@@ -43,33 +70,52 @@
             return (ObjectTemplate<T>::AllListObj[CurrContext].hasMappedValue(_id));
          }
-         
+
          static const StrHashMap<T>& GetCurrentListObject(void) { return (AllListObj[CurrContext]); }
          static HashMap<string, StrHashMap<T> >& GetAllListObject(void) { return (AllListObj); }
-                
-         static void SetContext(const string& id){ ObjectTemplate<T>::CurrContext = id; } 
-         
-         static string& GetCurrentContextId(void) { return (CurrContext); } 
-         
+
+         static void SetContext(const string& id){ ObjectTemplate<T>::CurrContext = id; }
+
+         static string& GetCurrentContextId(void) { return (CurrContext); }
+
          virtual ~ObjectTemplate(void)
          {/* Ne rien faire de plus */}
-         
+
       protected :
-      
+
          ObjectTemplate(void) : AbstractObject()
-         {/* Ne rien faire de plus */}         
-         ObjectTemplate(const string& _id) : AbstractObject(_id) 
          {/* Ne rien faire de plus */}
-         
+         ObjectTemplate(const string& _id) : AbstractObject(_id)
+         {/* Ne rien faire de plus */}
+
+         XML::XMLNode getNodeIncludedFile(const string& path, const string& _rootName)
+         {
+            ifstream istr( path.c_str() , ifstream::in );
+            return XML::XMLNode::CreateNode(istr, _rootName);
+         }
+
+         template <class V> static V* CreateInstanceAndParse( THashAttributes& attributes, XMLNode& _node, const char* defaultId, bool parseAttr = true )
+         {
+            V* instance_ptr = NULL; string did(defaultId);
+            if (defaultId != NULL)
+            {
+               if (V::HasObject(did))
+                  WARNING("Le noeud nommÃ© "+ did +" existe dÃ©jÃ  pour les instances de type "+V::GetName()+", le dernier dÃ©fini complÃ©tera le premier dans le context actuel!");
+               instance_ptr = (V*)&V::CreateObject(did);
+               instance_ptr->parse(_node, parseAttr);
+            }
+            return (instance_ptr);
+         }
+
       private :
-         
+
          static string CurrContext;
          static HashMap<string, StrHashMap<T> > AllListObj;
-      
+
    };// class ObjectTemplate
-   
+
    template <class T> string ObjectTemplate<T>::CurrContext ;
    template <class T> HashMap<string, StrHashMap<T> > ObjectTemplate<T>::AllListObj;
-   
+
 }// namespace XMLIOSERVER
-   
-#endif // __XMLIO_OBJECT_TEMPLATE__ 
+
+#endif // __XMLIO_OBJECT_TEMPLATE__
