--- /dev/null
+package adullact.publicrowdfunding.model.server;
+
+import adullact.publicrowdfunding.model.server.errorHandler.ErrorHandler;
+import adullact.publicrowdfunding.model.server.event.Event;
+import adullact.publicrowdfunding.model.server.request.Request;
+
+/**
+ * @author Ferrand and Nelaupe
+ */
+public class ServerObject
+<TRequest extends Request<TRequest, TEvent, TErrorHandler>,
+TEvent extends Event<TRequest, TEvent, TErrorHandler>,
+TErrorHandler extends ErrorHandler<TRequest, TEvent, TErrorHandler>> {
+
+ private TRequest m_request;
+ private TEvent m_event;
+ private TErrorHandler m_errorHandler;
+
+ public ServerObject() {
+ this.m_request = null;
+ this.m_event = null;
+ this.m_errorHandler = null;
+ }
+
+ public ServerObject(TRequest request, TEvent event, TErrorHandler errorHandler) {
+ this.m_request = request;
+ this.m_event = event;
+ this.m_errorHandler = errorHandler;
+
+ triumvirat();
+ }
+
+ @SuppressWarnings("unchecked")
+ public ServerObject(TEvent event, TErrorHandler errorHandler) {
+ this.m_request = (TRequest) this;
+ this.m_event = event;
+ this.m_errorHandler = errorHandler;
+
+ triumvirat();
+ }
+
+ @SuppressWarnings("unchecked")
+ public ServerObject(TRequest request, TErrorHandler errorHandler) {
+ this.m_request = request;
+ this.m_event = (TEvent) this;
+ this.m_errorHandler = errorHandler;
+
+ triumvirat();
+ }
+
+ @SuppressWarnings("unchecked")
+ public ServerObject(TRequest request, TEvent event) {
+ this.m_request = request;
+ this.m_event = event;
+ this.m_errorHandler = (TErrorHandler) this;
+
+ triumvirat();
+ }
+
+ private void triumvirat() {
+ m_request.defineRequest(m_request);
+ m_request.defineEvent(m_event);
+ m_request.defineErrorHandler(m_errorHandler);
+
+ m_event.defineRequest(m_request);
+ m_event.defineEvent(m_event);
+ m_event.defineErrorHandler(m_errorHandler);
+
+ m_errorHandler.defineRequest(m_request);
+ m_errorHandler.defineEvent(m_event);
+ m_errorHandler.defineErrorHandler(m_errorHandler);
+
+ }
+
+ protected TRequest request() {
+ return m_request;
+ }
+
+ protected TEvent event() {
+ return m_event;
+ }
+
+ protected TErrorHandler errorHandler() {
+ return m_errorHandler;
+ }
+
+ protected void defineRequest(TRequest request) {
+ m_request = request;
+ }
+
+ protected void defineEvent(TEvent event) {
+ m_event = event;
+ }
+
+ protected void defineErrorHandler(TErrorHandler errorHandler) {
+ m_errorHandler = errorHandler;
+ }
+
+}