Add Grouped behaviour.
[command.git] / include / command.h
index a48ab91f5ee02b8eed81a7645cbf2be904f3e9c2..7d01cb800cb9464a505fab1a957a9a5ef8698c00 100644 (file)
@@ -3,56 +3,49 @@
 
 #include <string>
 #include <vector>
+#include <typeinfo>
 #include <iostream>
 
 #include "parameter.h"
+#include "grouped.h"
 
 namespace command {
     /**
      * Main class for handling user passed parameters from command line.
      */
-    class Command {
-    protected:
-        std::vector<Parameter *> args;
+    class Command : protected Grouped {
     public:
         /**
          * Default constructor.
          *
-         * @param argc passed to the main function
-         * @param argv passed to the main function
+         * @param argc from the main function
+         * @param argv from the main function
          * @param params initializer_list containing Parameter handlers
          *      responsible for correctly handle user data.
          */
         Command(unsigned int argc, char *argv[], std::initializer_list<Parameter *> params)
-            : args(params) {
-
-            matchArguments(argc, argv);
-            invoke();
+            : Grouped(params, "Command") {
+            try {
+                for (unsigned int i = 1; i < argc; i++) {
+                    this->understand(argv[i]);
+                }
+                handle();
+            }
+            catch(const std::invalid_argument & exception) {
+                releaseMemory();
+                throw;
+            }
+            catch(const std::logic_error & exception) {
+                releaseMemory();
+                throw;
+            }
         }
 
         /**
          * Destructor. Releases allocated memory.
          */
         ~Command() {
-            for (Parameter * parameter : args) {
-                delete parameter;
-            }
-        }
-    protected:
-        /**
-         * Matches user passed arguments with available parameter handlers.
-         */
-        void matchArguments(unsigned int argc, char *argv[]) {
-//             param->passUserValue();
-        }
-
-        /**
-         * Invokes passed parameter handlers
-         */
-        void invoke() {
-            for(Parameter *param : params) {
-                param->handle();
-            }
+            releaseMemory();
         }
     };
 }