Index: src/Actions/AnalysisAction/CalculateCellVolumeAction.cpp
===================================================================
--- src/Actions/AnalysisAction/CalculateCellVolumeAction.cpp	(revision 15408592ea2fab27dfbc10cc6f5b99cae3244c89)
+++ src/Actions/AnalysisAction/CalculateCellVolumeAction.cpp	(revision 15408592ea2fab27dfbc10cc6f5b99cae3244c89)
@@ -0,0 +1,29 @@
+/*
+ * Project: MoleCuilder
+ * Description: creates and alters molecular systems
+ * Copyright (C)  2010 University of Bonn. All rights reserved.
+ * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
+ */
+
+/*
+ * CalculateCellVolumeAction.cpp
+ *
+ *  Created on: Oct 12, 2011
+ *      Author: heber
+ */
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "CodePatterns/MemDebug.hpp"
+
+#include "CalculateCellVolumeAction.hpp"
+
+CalculateCellVolumeCalculation::CalculateCellVolumeCalculation() :
+  Calculation<double>(0, Foostrait)
+{}
+
+CalculateCellVolumeCalculation::~CalculateCellVolumeCalculation()
+{}
Index: src/Actions/AnalysisAction/CalculateCellVolumeAction.def
===================================================================
--- src/Actions/AnalysisAction/CalculateCellVolumeAction.def	(revision 15408592ea2fab27dfbc10cc6f5b99cae3244c89)
+++ src/Actions/AnalysisAction/CalculateCellVolumeAction.def	(revision 15408592ea2fab27dfbc10cc6f5b99cae3244c89)
@@ -0,0 +1,31 @@
+/*
+ * CalculateCellVolumeAction.def
+ *
+ *  Created on: Oct 12, 2011
+ *      Author: heber
+ */
+
+// all includes and forward declarations necessary for non-integral types below
+
+// i.e. there is an integer with variable name Z that can be found in
+// ValueStorage by the token "Z" -> first column: int, Z, "Z"
+// "undefine" if no parameters are required, use (NODEFAULT) for each (undefined) default value
+#undef paramtypes
+#undef paramreferences
+#undef paramtokens
+#undef paramdescriptions
+#undef paramdefaults
+
+#undef statetypes
+#undef statereferences
+
+// some defines for all the names, you may use ACTION, STATE and PARAMS
+#define CATEGORY Analysis
+#define MENUNAME "analysis"
+#define MENUPOSITION 3
+#define ACTIONNAME CalculateCellVolume
+#define TOKEN "calculate-cell-volume"
+
+// finally the information stored in the ActionTrait specialization
+#define DESCRIPTION "Calculates the volume of the simulation domain"
+#undef SHORTFORM
Index: src/Actions/AnalysisAction/CalculateCellVolumeAction.hpp
===================================================================
--- src/Actions/AnalysisAction/CalculateCellVolumeAction.hpp	(revision 15408592ea2fab27dfbc10cc6f5b99cae3244c89)
+++ src/Actions/AnalysisAction/CalculateCellVolumeAction.hpp	(revision 15408592ea2fab27dfbc10cc6f5b99cae3244c89)
@@ -0,0 +1,30 @@
+/*
+ * CalculateCellVolumeAction.hpp
+ *
+ *  Created on: Oct 12, 2011
+ *      Author: heber
+ */
+
+#ifndef CALCULATECELLVOLUMEACTION_HPP_
+#define CALCULATECELLVOLUMEACTION_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include "Actions/Calculation.hpp"
+
+class CalculateCellVolumeCalculation : public Calculation<double>
+{
+public:
+  CalculateCellVolumeCalculation();
+  ~CalculateCellVolumeCalculation();
+
+private:
+};
+
+
+
+#endif /* CALCULATECELLVOLUMEACTION_HPP_ */
Index: src/Actions/Reaction.hpp
===================================================================
--- src/Actions/Reaction.hpp	(revision 15408592ea2fab27dfbc10cc6f5b99cae3244c89)
+++ src/Actions/Reaction.hpp	(revision 15408592ea2fab27dfbc10cc6f5b99cae3244c89)
@@ -0,0 +1,90 @@
+/*
+ * Reaction.hpp
+ *
+ *  Created on: Oct 13, 2011
+ *      Author: heber
+ */
+
+#ifndef REACTION_HPP_
+#define REACTION_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+
+#include "Actions/Action.hpp"
+
+namespace MoleCuilder {
+
+/**
+ * A Reaction is an Action with a return value that is set during the call and may be
+ * inspected afterwards.
+ *
+ * This class can be used in the same way as any other Action, but has some special methods
+ * for inspecting the result of the calculation.
+ */
+template<typename T>
+class Reaction : public Action
+{
+public:
+  Reaction(const ActionTrait &_trait, bool _doRegister=true);
+  virtual ~Reaction();
+
+  /**
+   * Reimplemented call method for Action Base class.
+   * Resets the result and then redoes the calculation. Can be used to retrigger calculations
+   * from menu Items or other places.
+   */
+  virtual bool canUndo();
+
+  virtual bool shouldUndo();
+
+  /**
+   * Does the actual calculation and returns the result.
+   * When the calculation has been done before it is not redone, but the previous cached result is returned.
+   * Call reset to delete the cached value.
+   */
+  virtual T operator()();
+
+  /**
+   * Check if a cached result is available.
+   */
+  virtual bool hasResult();
+
+  /**
+   * Get the cached result.
+   * Fails if there is no cached result.
+   */
+  virtual T getResult();
+
+  /**
+   * Delete a previously calculated result from the cache.
+   */
+  virtual void reset();
+
+protected:
+  virtual Dialog *fillDialog(Dialog *dialog)=0;
+
+protected:
+  //!> result of the calculation
+  T* result;
+
+  /**
+   * Pure virtual method for implementation of the actual calculation procedure.
+   */
+  virtual T* doCalc()=0;
+private:
+  virtual void getParametersfromValueStorage()=0;
+  virtual Action::state_ptr performCall();
+  virtual Action::state_ptr performUndo(Action::state_ptr);
+  virtual Action::state_ptr performRedo(Action::state_ptr);
+
+  //!> states whether result is done or not (i.e. \a result contains valid result
+  bool done;
+};
+
+}
+
+#endif /* REACTION_HPP_ */
Index: src/Actions/Reaction_impl.hpp
===================================================================
--- src/Actions/Reaction_impl.hpp	(revision 15408592ea2fab27dfbc10cc6f5b99cae3244c89)
+++ src/Actions/Reaction_impl.hpp	(revision 15408592ea2fab27dfbc10cc6f5b99cae3244c89)
@@ -0,0 +1,96 @@
+/*
+ * Reaction_impl.hpp
+ *
+ *  Created on: Oct 13, 2011
+ *      Author: heber
+ */
+
+#ifndef REACTION_IMPL_HPP_
+#define REACTION_IMPL_HPP_
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "CodePatterns/Assert.hpp"
+
+#include "Actions/Action.hpp"
+
+#include <cassert>
+
+using namespace MoleCuilder;
+
+template<typename T>
+Reaction<T>::Reaction(const ActionTrait &_trait, bool _doRegister) :
+  Action(_trait,_doRegister),
+  result(0),
+  done(false)
+{}
+
+template<typename T>
+Reaction<T>::~Reaction()
+{
+  delete result;
+}
+
+template<typename T>
+Action::state_ptr Reaction<T>::performCall(){
+  reset();
+  (*this)();
+  return Action::success;
+}
+
+template<typename T>
+Action::state_ptr Reaction<T>::performUndo(Action::state_ptr){
+  ASSERT(0,"Cannot undo a calculation");
+  return Action::success;
+}
+template<typename T>
+Action::state_ptr Reaction<T>::performRedo(Action::state_ptr){
+  ASSERT(0,"Cannot redo a calculation");
+  return Action::success;
+}
+
+template<typename T>
+bool Reaction<T>::canUndo()
+{
+  return false;
+}
+
+template<typename T>
+bool Reaction<T>::shouldUndo()
+{
+  return false;
+}
+
+// methods for calculation infrastructure
+
+template<typename T>
+T Reaction<T>::operator()(){
+  if(!done){
+    result = doCalc();
+    done = true;
+  }
+  return *result;
+}
+
+template<typename T>
+bool Reaction<T>::hasResult(){
+  return done;
+}
+
+template<typename T>
+T Reaction<T>::getResult(){
+  ASSERT(done, "Reaction<T>::getResult() - No result calculated yet.");
+  return *result;
+}
+
+template<typename T>
+void Reaction<T>::reset(){
+  done = false;
+  delete result;
+  result = NULL;
+}
+
+#endif /* REACTION_IMPL_HPP_ */
Index: src/Actions/Reaction_impl_header.hpp
===================================================================
--- src/Actions/Reaction_impl_header.hpp	(revision 15408592ea2fab27dfbc10cc6f5b99cae3244c89)
+++ src/Actions/Reaction_impl_header.hpp	(revision 15408592ea2fab27dfbc10cc6f5b99cae3244c89)
@@ -0,0 +1,253 @@
+/*
+ * Reaction_impl_header.hpp
+ *
+ *  Created on: Oct 13, 2011
+ *      Author: heber
+ */
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/comparison/not_equal.hpp>
+#include <boost/preprocessor/control/if.hpp>
+#include <boost/preprocessor/debug/assert.hpp>
+#include <boost/preprocessor/iteration/local.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/repetition/repeat.hpp>
+#include <boost/preprocessor/seq/elem.hpp>
+#include <boost/preprocessor/seq/push_back.hpp>
+#include <boost/preprocessor/seq/seq.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/seq/transform.hpp>
+
+#include <iostream>
+#include <typeinfo>
+
+#include "Actions/ActionTraits.hpp"
+#include "Actions/ValueStorage.hpp"
+
+// some derived names: if CATEGORY is not given, we don't prefix with it
+#ifdef CATEGORY
+#define REACTION BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, Action))
+#define COMMAND BOOST_PP_CAT(CATEGORY, ACTIONNAME)
+#define PARAMS BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, Parameters))
+#else
+#define REACTION BOOST_PP_CAT(ACTIONNAME, Action)
+#define COMMAND ACTIONNAME
+#define PARAMS BOOST_PP_CAT(ACTIONNAME, Parameters)
+#endif
+// check if no lists given
+#ifndef paramtypes
+#define MAXPARAMTYPES 0
+#else
+#define MAXPARAMTYPES BOOST_PP_SEQ_SIZE(paramtypes)
+#endif
+
+// check user has given name and category
+#ifndef ACTIONNAME
+ERROR: No "ACTIONNAME" defined in: __FILE__
+#endif
+
+// calculate numbers and check whether all have same size
+#ifdef paramtokens
+BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXPARAMTYPES, BOOST_PP_SEQ_SIZE(paramtokens)),\
+  ERROR: There are not the same number of "paramtokens" and "paramtypes" in: __FILE__ \
+)
+#endif
+#ifdef paramreferences
+BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXPARAMTYPES, BOOST_PP_SEQ_SIZE(paramreferences)),\
+  ERROR: There are not the same number of "paramtokens" and "paramreferences" in: __FILE__ \
+)
+#endif
+#ifdef paramdescriptions
+BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXPARAMTYPES, BOOST_PP_SEQ_SIZE(paramdescriptions)),\
+  ERROR: There are not the same number of "paramtokens" and "paramdescriptions" in: __FILE__ \
+)
+#endif
+
+// check for mandatory defines
+#ifndef DESCRIPTION
+BOOST_PP_ASSERT_MSG(0, \
+    "ERROR: Description is mandatory for Actions, here for REACTION " \
+)
+#endif
+
+// check if paramdefaults is given, otherwise fill list with NODEFAULT
+// this does not work: paramdefaults has to be completely defined before
+// being used within option_print (used as an array there and not as
+// some function call still to be expanded)
+//#define paramdefaults (NODEFAULT)
+//#define tempvalue(z,n,value)
+//  BOOST_PP_CAT(value,(NODEFAULT))
+//BOOST_PP_REPEAT(tempvalue, MAXPARAMTYPES, paramdefaults)
+//#undef tempvalue
+//#else
+
+// if present, check if correct number of arguments
+#ifdef paramdefaults
+BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXPARAMTYPES, BOOST_PP_SEQ_SIZE(paramdefaults)),\
+  ERROR: There are not the same number of "paramtokens" and "paramdefaults" in: __FILE__ \
+)
+#endif
+
+// print a list of type ref followed by a separator, i.e. "int i;"
+#define type_print(z,n,TYPELIST, VARLIST, separator) \
+  BOOST_PP_SEQ_ELEM(n, TYPELIST) \
+  BOOST_PP_SEQ_ELEM(n, VARLIST)\
+  separator
+
+// print a list of type ref followed, i.e. "int i, double position"
+#define type_list(z,n,TYPELIST, VARLIST) \
+  BOOST_PP_COMMA_IF(n)\
+  BOOST_PP_SEQ_ELEM(n, TYPELIST) \
+  BOOST_PP_SEQ_ELEM(n, VARLIST)
+
+// prints Options.insert
+#ifdef paramdefaults
+#define option_print(z,n,unused, unused2) \
+  tester = Options. insert (\
+      std::pair< std::string, OptionTrait *> ( \
+      BOOST_PP_SEQ_ELEM(n, paramtokens), \
+      new OptionTrait(\
+          BOOST_PP_SEQ_ELEM(n, paramtokens), \
+          &typeid( BOOST_PP_SEQ_ELEM(n, paramtypes) ), \
+          BOOST_PP_SEQ_ELEM(n, paramdescriptions), \
+          std::string( BOOST_PP_SEQ_ELEM(n, paramdefaults) ) )\
+      )\
+  ); \
+  ASSERT(tester.second, "ActionTrait<REACTION>::ActionTrait<REACTION>() option token present twice!");
+#else
+#define option_print(z,n,unused, unused2) \
+  tester = Options. insert (\
+      std::pair< std::string, OptionTrait *> ( \
+      BOOST_PP_SEQ_ELEM(n, paramtokens), \
+      new OptionTrait(\
+          BOOST_PP_SEQ_ELEM(n, paramtokens), \
+          &typeid( BOOST_PP_SEQ_ELEM(n, paramtypes) ), \
+          BOOST_PP_SEQ_ELEM(n, paramdescriptions), \
+          NODEFAULT )\
+      )\
+  ); \
+  ASSERT(tester.second, "ActionTrait<REACTION>::ActionTrait<REACTION>() option token present twice!");
+#endif
+
+namespace MoleCuilder {
+
+#ifndef returntype
+BOOST_PP_ASSERT_MSG(0,\
+  ERROR: No returntype is defined in __FILE__ \
+)
+#endif
+#define RETURNTYPE returntype
+
+// set the return type
+RETURNTYPE COMMAND(
+#if defined paramtypes && defined paramreferences
+#define BOOST_PP_LOCAL_MACRO(n) type_list(~, n, paramtypes, paramreferences)
+#define BOOST_PP_LOCAL_LIMITS  (0, MAXPARAMTYPES-1)
+#include BOOST_PP_LOCAL_ITERATE()
+#endif
+    );
+
+class REACTION;
+
+template <>
+class ActionTraits<REACTION> : public ActionTrait {
+public:
+  ActionTraits() :
+#ifndef SHORTFORM
+    ActionTrait(OptionTrait(TOKEN, &typeid(void), DESCRIPTION, std::string()))
+#else
+    ActionTrait(OptionTrait(TOKEN, &typeid(void), DESCRIPTION, std::string(), SHORTFORM))
+#endif /* SHORTFORM */
+  {
+  // initialize remainder of action info
+#ifdef MENUNAME
+    MenuTitle = MENUNAME;
+#endif
+#ifdef MENUPOSITION
+    MenuPosition = MENUPOSITION;
+#endif
+
+    // initialize action's options
+    std::pair< ActionTrait::options_iterator, bool > tester;
+#ifdef paramtokens
+#define BOOST_PP_LOCAL_MACRO(n) option_print(~, n, ~, )
+#define BOOST_PP_LOCAL_LIMITS  (0, MAXPARAMTYPES-1)
+#include BOOST_PP_LOCAL_ITERATE()
+#endif
+    // associate action's short form also with option
+#ifdef SHORTFORM
+    if (Options.find(TOKEN) != Options.end())
+      Options[TOKEN]->setShortForm(std::string(SHORTFORM));
+#endif /* SHORTFORM */
+    //std::cout << "ActionTraits<" << BOOST_PP_STRINGIZE(REACTION) << ">::ActionTraits() on instance " << this << " with " << getName() << ", type " << getTypeName() << " and description " << getDescription() << std::endl;
+  }
+
+  virtual ~ActionTraits() {
+    //std::cout << "ActionTraits<" << BOOST_PP_STRINGIZE(REACTION) << ">::~ActionTraits() on instance " << this << " with name " << getName() << " called." << std::endl;
+  }
+};
+
+class REACTION : public Reaction< RETURNTYPE > {
+  friend RETURNTYPE COMMAND(
+  #if defined paramtypes && defined paramreferences
+  #define BOOST_PP_LOCAL_MACRO(n) type_list(~, n, paramtypes, paramreferences)
+  #define BOOST_PP_LOCAL_LIMITS  (0, MAXPARAMTYPES-1)
+  #include BOOST_PP_LOCAL_ITERATE()
+  #endif
+  );
+
+public:
+  REACTION();
+  virtual ~REACTION();
+
+  virtual RETURNTYPE * doCalc();
+
+  struct PARAMS : ActionParameters {
+  #if defined paramtypes && defined paramreferences
+  #define BOOST_PP_LOCAL_MACRO(n) type_print(~, n, paramtypes, paramreferences, ;)
+  #define BOOST_PP_LOCAL_LIMITS  (0, MAXPARAMTYPES-1)
+  #include BOOST_PP_LOCAL_ITERATE()
+  #endif
+  } params;
+
+protected:
+  virtual Dialog * fillDialog(Dialog*);
+private:
+  virtual void getParametersfromValueStorage();
+};
+
+}
+
+#undef paramtypes
+#undef paramtokens
+#undef paramreferences
+#undef paramdescriptions
+#undef paramdefaults
+#undef MAXPARAMTYPES
+
+#undef returntype
+#undef RETURNTYPE
+
+#undef option_print
+#undef type_print
+#undef type_list
+
+#undef REACTION
+#undef COMMAND
+#undef COMMANDFULL
+#undef PARAMS
+
+#undef ACTIONNAME
+#undef CATEGORY
+#undef MENUNAME
+#undef MENUPOSITION
+#undef TOKEN
+
+#undef DESCRIPTION
+#undef SHORTFORM
Index: src/Actions/Reaction_impl_pre.hpp
===================================================================
--- src/Actions/Reaction_impl_pre.hpp	(revision 15408592ea2fab27dfbc10cc6f5b99cae3244c89)
+++ src/Actions/Reaction_impl_pre.hpp	(revision 15408592ea2fab27dfbc10cc6f5b99cae3244c89)
@@ -0,0 +1,265 @@
+/*
+ * Reaction_impl.hpp
+ *
+ *  Created on: Oct 13, 2011
+ *      Author: heber
+ */
+
+/** These macros define the following functions, necessary but repetitive for
+ * every Action:
+ *  -# Dialog* fillDialog()
+ *  -# action command (e.g. AnalysisMolecularVolume() )
+ *  -# void getParametersfromValuStorage()
+ *  -# struct Action...Parameters
+ *
+ *  For this, the user has the define the following values, each with
+ *  parenthesis, for the values/parameters the action needs
+ *  -# paramtypes, e.g. (int)(double)
+ *  -# paramtokens, e.g. ("Z")("length")
+ *  -# paramreferences, e.g. (Z)(length)
+ *  and for additional values/parameters to save in the state
+ *  -# statetypes, e.g. (int)(double)
+ *  -# statereferences, e.g. (Z)(length)
+ *  and the name and category of the action
+ *  -# CATEGORY, e.g. Analysis
+ *  -# ACTIONNAME, e.g. MolecularVolume
+ */
+
+// include config.h
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <boost/preprocessor/cat.hpp>
+#include <boost/preprocessor/comparison/equal.hpp>
+#include <boost/preprocessor/comparison/not_equal.hpp>
+#include <boost/preprocessor/debug/assert.hpp>
+#include <boost/preprocessor/iteration/local.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/seq/elem.hpp>
+#include <boost/preprocessor/seq/seq.hpp>
+#include <boost/preprocessor/seq/size.hpp>
+#include <boost/preprocessor/seq/transform.hpp>
+
+// some derived names: if CATEGORY is not given, we don't prefix with it
+#ifdef CATEGORY
+#define REACTION BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, Action))
+#define COMMAND BOOST_PP_CAT(CATEGORY, ACTIONNAME)
+#define STATE BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, State))
+#define PARAMS BOOST_PP_CAT(CATEGORY, BOOST_PP_CAT(ACTIONNAME, Parameters))
+#else
+#define REACTION BOOST_PP_CAT(ACTIONNAME, Action)
+#define COMMAND ACTIONNAME
+#define STATE BOOST_PP_CAT(ACTIONNAME, State)
+#define PARAMS BOOST_PP_CAT(ACTIONNAME, Parameters)
+#endif
+
+// check if no lists given
+#ifndef paramtypes
+#define MAXPARAMTYPES 0
+#else
+#define MAXPARAMTYPES BOOST_PP_SEQ_SIZE(paramtypes)
+#endif
+#ifndef statetypes
+#define MAXSTATETYPES 0
+#else
+#define MAXSTATETYPES BOOST_PP_SEQ_SIZE(statetypes)
+#endif
+
+// check user has given name and category
+#ifndef ACTIONNAME
+ERROR: No "ACTIONNAME" defined in: __FILE__
+#endif
+
+// calculate numbers and check whether all have same size
+#ifdef paramtokens
+BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXPARAMTYPES, BOOST_PP_SEQ_SIZE(paramtokens)),\
+  ERROR: There are not the same number of "paramtokens" and "paramtypes" in: __FILE__ \
+)
+#endif
+#ifdef paramreferences
+BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXPARAMTYPES, BOOST_PP_SEQ_SIZE(paramreferences)),\
+  ERROR: There are not the same number of "paramtokens" and "paramreferences" in: __FILE__ \
+)
+#endif
+
+#ifdef statetypes
+BOOST_PP_ASSERT_MSG(BOOST_PP_EQUAL(MAXSTATETYPES, BOOST_PP_SEQ_SIZE(statereferences)),\
+  ERROR: There are not the same number of "statetypes" and "statereferences" in: __FILE__ \
+)
+#endif
+
+// set the return type
+#ifndef returntype
+BOOST_PP_ASSERT_MSG(0,\
+  ERROR: No returntype is defined in __FILE__ \
+)
+#endif
+#define RETURNTYPE returntype
+
+// print a list of type ref followed by a separator, i.e. "int i;"
+#define initialiser_print(z,n,initialiserlist) \
+  BOOST_PP_SEQ_ELEM(n, initialiserlist) \
+  (BOOST_PP_CAT(_, BOOST_PP_SEQ_ELEM(n, initialiserlist))),
+
+// print a list of ref(_ref) followed by a separator, i.e. "id(_id),"
+#define type_print(z,n,TYPELIST, VARLIST, separator) \
+  BOOST_PP_SEQ_ELEM(n, TYPELIST) \
+  BOOST_PP_SEQ_ELEM(n, VARLIST)\
+  separator
+
+// print a list of type ref followed, i.e. "int i, double position"
+#define type_list(z,n,TYPELIST,VARLIST) \
+  BOOST_PP_COMMA_IF(n)\
+  BOOST_PP_SEQ_ELEM(n, TYPELIST) \
+  BOOST_PP_SEQ_ELEM(n, VARLIST)
+
+// prints dialog->query calls for paramtypes with tokens
+#define dialog_print(z,n,unused) \
+  dialog->query<\
+  BOOST_PP_SEQ_ELEM(n, paramtypes)\
+  >(\
+  BOOST_PP_SEQ_ELEM(n, paramtokens)\
+  , Traits.getDescription()\
+  );
+
+// prints set/queryCurrentValue (command) for paramreferences and paramtokens
+#define value_print(z,n,command, prefix) \
+  ValueStorage::getInstance(). command (\
+  BOOST_PP_SEQ_ELEM(n, paramtokens)\
+  , \
+  prefix\
+  BOOST_PP_SEQ_ELEM(n, paramreferences)\
+  );
+
+// prints set/queryCurrentValue (command) for paramreferences and paramtokens
+#define valuetype_print(z,n,command, prefix) \
+  ValueStorage::getInstance(). command< \
+  BOOST_PP_SEQ_ELEM(n, paramtypes) \
+  > (\
+  BOOST_PP_SEQ_ELEM(n, paramtokens)\
+  , \
+  prefix\
+  BOOST_PP_SEQ_ELEM(n, paramreferences)\
+  );
+
+#define stringtype std::string
+
+#define type2string(s, data, elem) \
+	stringtype
+
+
+#include "Actions/ActionRegistry.hpp"
+//#include "Actions/ActionTraits.hpp"
+#include "UIElements/Dialog.hpp"
+
+#ifdef paramtokens
+#define statenecessary 1
+#endif
+#ifndef statetokens
+#define statenecessary 1
+#endif
+
+namespace MoleCuilder {
+
+// =========== constructor ===========
+REACTION::REACTION () :
+  Reaction< RETURNTYPE >(ActionTraits< REACTION >(), false)
+{}
+
+// =========== destructor ===========
+REACTION::~REACTION ()
+{
+  //std::cout << "Action REACTION is being destroyed." << std::endl;
+}
+
+// =========== fill a dialog ===========
+Dialog* REACTION::fillDialog(Dialog *dialog) {
+        ASSERT(dialog,"No Dialog given when filling actionname's dialog");
+#if BOOST_PP_EQUAL(MAXPARAMTYPES,0)
+        dialog->queryEmpty(TOKEN, Traits.getDescription());
+#else
+#define BOOST_PP_LOCAL_MACRO(n) dialog_print(~, n, ~)
+#define BOOST_PP_LOCAL_LIMITS  (0, MAXPARAMTYPES-1)
+#include BOOST_PP_LOCAL_ITERATE()
+#endif
+        return dialog;
+};
+
+// =========== command for calling action directly ===========
+RETURNTYPE COMMAND(
+#if defined paramtypes && defined paramreferences
+#define BOOST_PP_LOCAL_MACRO(n) type_list(~, n, paramtypes, paramreferences)
+#define BOOST_PP_LOCAL_LIMITS  (0, MAXPARAMTYPES-1)
+#include BOOST_PP_LOCAL_ITERATE()
+#endif
+)
+{
+  Action *ToCall = ActionRegistry::getInstance().getActionByName( TOKEN ); //->clone(params);
+  //REACTION::PARAMS params;
+#if BOOST_PP_NOT_EQUAL(MAXPARAMTYPES,0)
+#define BOOST_PP_LOCAL_MACRO(n) value_print(~, n, setCurrentValue, )
+#define BOOST_PP_LOCAL_LIMITS  (0, MAXPARAMTYPES-1)
+#include BOOST_PP_LOCAL_ITERATE()
+#endif
+  ToCall->call(Action::NonInteractive);
+
+  return static_cast<Reaction< RETURNTYPE > *>(ToCall)->getResult();
+};
+
+RETURNTYPE BOOST_PP_CAT( COMMAND, _stringargs)(
+#if defined paramtypes && defined paramreferences
+#define BOOST_PP_LOCAL_MACRO(n) type_list(~, n, BOOST_PP_SEQ_TRANSFORM( type2string, , paramtypes), paramreferences)
+#define BOOST_PP_LOCAL_LIMITS  (0, MAXPARAMTYPES-1)
+#include BOOST_PP_LOCAL_ITERATE()
+#endif
+	) {
+  Action *ToCall = ActionRegistry::getInstance().getActionByName( TOKEN ); //->clone(params);
+  //REACTION::PARAMS params;
+#if BOOST_PP_NOT_EQUAL(MAXPARAMTYPES,0)
+#define BOOST_PP_LOCAL_MACRO(n) valuetype_print(~, n, setCurrentValueByString, )
+#define BOOST_PP_LOCAL_LIMITS  (0, MAXPARAMTYPES-1)
+#include BOOST_PP_LOCAL_ITERATE()
+#endif
+  ToCall->call(MoleCuilder::Action::NonInteractive);
+
+  return static_cast<Reaction< RETURNTYPE > *>(ToCall)->getResult();
+};
+
+// =========== obtain parameters from Storage, used by performCall() ===========
+void REACTION::getParametersfromValueStorage() {
+#if BOOST_PP_NOT_EQUAL(MAXPARAMTYPES,0)
+#define BOOST_PP_LOCAL_MACRO(n) value_print(~, n, queryCurrentValue, params.)
+#define BOOST_PP_LOCAL_LIMITS  (0, MAXPARAMTYPES-1)
+#include BOOST_PP_LOCAL_ITERATE()
+#endif
+};
+
+}
+
+// free up defines
+#undef paramtypes
+#undef paramtokens
+#undef paramreferences
+#undef MAXPARAMTYPES
+
+#undef returntype
+#undef RETURNTYPE
+
+#undef type2string
+#undef stringtype
+#undef initialiser_print
+#undef type_print
+#undef type_list
+#undef dialog_print
+#undef value_print
+#undef valuetype_print
+
+#undef REACTION
+#undef COMMAND
+#undef PARAMS
+#undef STATE
+
+#undef ACTIONNAME
+#undef CATEGORY
+#undef TOKEN
