Index: src/Helpers/Assert.cpp
===================================================================
--- src/Helpers/Assert.cpp	(revision 229e3ccb4e9cb5051f35390f07ad9812609ea0d4)
+++ src/Helpers/Assert.cpp	(revision 5be0eb5b503e36533a617d7c857b0c9324a0e178)
@@ -11,5 +11,41 @@
 using namespace std;
 
-bool _my_assert::always_throw = false;
+namespace Assert{
+  AssertionFailure::AssertionFailure(std::string _condition,
+                                     std::string _file,
+                                     int _line,
+                                     std::string _message) :
+    condition(_condition),
+    file(_file),
+    line(_line),
+    message(_message)
+  {}
+
+  std::string AssertionFailure::getFile(){
+    return file;
+  }
+
+  int AssertionFailure::getLine(){
+    return line;
+  }
+
+  std::string AssertionFailure::getMessage(){
+    return message;
+  }
+
+  std::ostream& AssertionFailure::operator<<(std::ostream& out){
+    out << "Assertion \"" << condition << "\" failed in file " << file << " at line " << line << endl;
+    out << "Assertion Message: " << message << std::endl;
+    return out;
+  }
+
+  const char  ActionKeys[]  = {'\0','a','t','i'};
+  const char* ActionNames[] = {"Ask","Abort","Throw","Ignore"};
+}
+
+using namespace Assert;
+
+Action _my_assert::defaultAction = Ask;
+std::vector<Assert::hook_t> _my_assert::hooks;
 
 bool _my_assert::check(const bool res,
@@ -23,11 +59,13 @@
     cout << "Assertion " << condition << " failed in file " << filename << " at line " << line << endl;
     cout << "Assertion Message: " << message << std::endl;
-    if(always_throw){
-      throw AssertException(filename,line);
-    }
     while(true){
-      cout << "Please choose: (a)bbort, (t)hrow execption, (i)gnore, al(w)ays ignore" << endl;
       char choice;
-      cin >> choice;
+      if(defaultAction==Ask) {
+        cout << "Please choose: (a)bort, (t)hrow execption, (i)gnore, al(w)ays ignore" << endl;
+        cin >> choice;
+      }
+      else{
+        choice = ActionKeys[defaultAction];
+      }
       switch(choice){
         case 'a':
@@ -35,5 +73,5 @@
           break;
         case 't':
-          throw AssertException(filename,line);
+          throw AssertionFailure(condition,filename,line,message);
           break;
         case 'w':
@@ -48,2 +86,33 @@
   return false;
 }
+
+void _my_assert::doHooks(){
+  for(vector<hook_t>::reverse_iterator iter = hooks.rbegin(); iter!=hooks.rend(); ++iter ){
+    (*iter)();
+  }
+}
+
+void _my_assert::addHook(hook_t hook){
+  hooks.push_back(hook);
+}
+
+void _my_assert::removeHook(Assert::hook_t hook){
+  for(vector<hook_t>::iterator iter = hooks.begin(); iter!=hooks.end();){
+    if((*iter)==hook){
+      iter = hooks.erase(iter);
+    }
+    else{
+      ++iter;
+    }
+  }
+}
+
+void _my_assert::setDefault(Assert::Action action){
+  defaultAction = action;
+}
+Assert::Action _my_assert::getDefault(){
+  return defaultAction;
+}
+std::string _my_assert::printDefault(){
+  return ActionNames[defaultAction];
+}
Index: src/Helpers/Assert.hpp
===================================================================
--- src/Helpers/Assert.hpp	(revision 229e3ccb4e9cb5051f35390f07ad9812609ea0d4)
+++ src/Helpers/Assert.hpp	(revision 5be0eb5b503e36533a617d7c857b0c9324a0e178)
@@ -10,21 +10,30 @@
 
 #include<string>
+#include<vector>
 
-class AssertException{
-public:
-  AssertException(std::string _file, int _line) :
-    file(_file),
-    line(_line)
-    {}
-  std::string getFile(){
-      return file;
-    }
-  int getLine(){
-    return line;
-  }
-private:
-  std::string file;
-  int line;
-};
+namespace Assert{
+
+  typedef void (*hook_t)(void);
+
+
+  enum Action {Ask,Abort,Throw,Ignore,MAX_ACTION};
+  extern const char  ActionKeys[MAX_ACTION];
+  extern const char* ActionNames[MAX_ACTION];
+
+  class AssertionFailure{
+  public:
+    AssertionFailure(std::string _condition, std::string _file, int _line, std::string _message);
+    std::string getFile();
+    int getLine();
+    std::string getMessage();
+
+    std::ostream& operator<<(std::ostream&);
+  private:
+    std::string condition;
+    std::string file;
+    int line;
+    std::string message;
+  };
+}
 
 #ifndef NDEBUG
@@ -44,16 +53,22 @@
       static bool ignore = false;\
       if(!ignore){\
-        if(_my_assert::check((condition),STRINGIFY(condition),(message),__FILE__,__LINE__,ignore))\
+        if(_my_assert::check((condition),STRINGIFY(condition),(message),__FILE__,__LINE__,ignore)){\
+          _my_assert::doHooks();\
           DEBUG_BREAK;\
+        }\
       } \
     }while(0)
 
-  #define ASSERT_DO_THROW     do{_my_assert::always_throw=true;}while(0)
-  #define ASSERT_DONT_THROW   do{_my_assert::always_throw=false;}while(0)
+  #define ASSERT_DO(action)    do{_my_assert::setDefault(action);}while(0)
+  #define ASSERT_HOOK(hook)    do{_my_assert::addHook(hook);}while(0)
+  #define ASSERT_UNHOOK(hook)  do{_my_assert::removeHook(hook);}while(0)
+  #define ASSERT_DEFAULT       (_myAssert::printDefault())
 #else
   // we need to do something, so this is the usual solution (e.g. assert.h)
   #define ASSERT(condition,message) (void)(0)
-  #define ASSERT_DO_THROW           (void)(0)
-  #define ASSERT_DONT_THROW         (void)(0)
+  #define ASSERT_DO(action)         (void)(0)
+  #define ASSERT_HOOK(hook)         (void)(0)
+  #define ASSERT_UNHOOK(hook)       (void)(0)
+  #define ASSERT_DEFAULT            std::string("Deactivated")
 #endif
 
@@ -67,5 +82,13 @@
                     const int line,
                     bool& ignore);
-  static bool always_throw;
+  static void addHook(Assert::hook_t hook);
+  static void removeHook(Assert::hook_t hook);
+  static void doHooks();
+  static void setDefault(Assert::Action);
+  static Assert::Action getDefault();
+  static std::string printDefault();
+private:
+  static Assert::Action defaultAction;
+  static std::vector<Assert::hook_t> hooks;
 };
 //! @endcond
