Changed LICENSE. Now referenced to web site and file on project root directory
[anna.git] / include / anna / app / functions.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #ifndef anna_app_functions_hpp
10 #define anna_app_functions_hpp
11
12 #include <anna/core/functions.hpp>
13
14 #include <anna/app/Application.hpp>
15
16 namespace anna {
17
18 namespace app {
19
20 class Application;
21
22 /**
23    functions - Metodos y variables
24 */
25 struct functions : public anna::functions {
26   /**
27      Devuelve la referencia de la instancia de nuestra aplicacion
28   */
29   static Application& getApp() throw(RuntimeException);
30
31   /**
32      Patron para obtener facilmente la instancia de un determinado componente.
33      Estos dos parametros suelen ser sustituidos por la macro C <b>FILE_LOCATION</b>.
34
35      \param fromFile Fichero desde el que se invoca a este metodo
36      \param fromLine Numero de linea desde el que se invoca a este metodo.
37
38      \return La instancia del componente de la clase recibida como parametro.
39      \warning La clase T de implementar un metodo de la forma:
40      \code
41          static const char* getClassName () throw ();
42      \endcode
43      \see Component
44   */
45   template <typename T> static T* component(const char* fromFile, const int fromLine)
46   throw(anna::RuntimeException) {
47     return component<T> (T::getClassName(), fromFile, fromLine);
48   }
49
50   /**
51      Patron para obtener facilmente la instancia de un determinado componente.
52      Estos dos parametros suelen ser sustituidos por la macro C <b>FILE_LOCATION</b>.
53      \param className Nombre del componente buscado.
54      \param fromFile Fichero desde el que se invoca a este metodo
55      \param fromLine Numero de linea desde el que se invoca a este metodo.
56
57      \return La instancia del componente de la clase recibida como parametro.
58      \see Component
59   */
60   template <typename T> static T* component(const char* className, const char* fromFile, const int fromLine)
61   throw(anna::RuntimeException) {
62     T* result = static_cast <T*>(functions::getApp().find(className));
63
64     if(result == NULL) {
65       std::string msg(className);
66       msg += " | Componente no registrado";
67       throw RuntimeException(msg, fromFile, fromLine);
68     }
69
70     return result;
71   }
72 };
73
74 }
75 }
76
77 #endif
78
79