Add Possibility to set MultiValue Parameters.
[command.git] / include / argument.h
index 53dea343344e8b3b1bf42ab301551135eb9d33c0..a32cf82064893f9f78677aea1a9e3c4bb3d4a3f7 100644 (file)
 namespace command {
     /**
      * Class responsible for handling commandline arguments.
-     * Arguments are required, non-named parameters of program.
-     * Accepts
+     * Arguments are non-named parameters of program.
      *
      * Example:
-     *  ./myprog ARGUMENT
-     *  ./myprog /path/to/file
-     *  ./myprog "some argument"
+     *  ./myprog ARGUMENT
+     *  ./myprog /path/to/file
+     *  ./myprog "some argument"
      */
-    template<typename ArgumentType>
-    class Argument : public Parameter, public Callable<ArgumentType> {
+    template<typename ParameterType>
+    class Argument : public Parameter, public Callable<ParameterType> {
     protected:
-        /** Variable indicating if current Argument was already used or not */
-        bool used = false;
-
-        ArgumentType argument;
+        ParameterType value;
     public:
         typedef class Argument Type;
 
@@ -35,8 +31,8 @@ namespace command {
          * @param description Description of current Argument
          * @param function Function used to handle current Argument.
          */
-        Argument(const std::string & description, void (*function)(ArgumentType))
-            : Parameter(description), Callable<ArgumentType>(function) {
+        Argument(const std::string & description, void (*function)(ParameterType))
+            : Parameter(description), Callable<ParameterType>(function) {
         }
 
         /**
@@ -45,10 +41,11 @@ namespace command {
         virtual ~Argument() { }
 
         /**
-         *
+         * \inheritdoc
          */
         virtual void handle() {
-            this->call(argument);
+            this->call(value);
+            this->used = true;
         }
 
         /**
@@ -56,28 +53,25 @@ namespace command {
          * If so current Argument is flagged as used and no more checks against
          * it will be done in future.
          *
-         * \attention If conversion from passed value to ArgumentType is
+         * \attention If conversion from passed value to ParameterType is
          * impossible, it is ignored. It means that it is not understanded by
          * Argument.
          *
          * @param argv command line value against which test will be made.
          *
-         * @return If passed argv is succesfully converted to ArgumentType,
+         * @return If passed argv is succesfully converted to ParameterType,
          *  returns true and Argument is set as used one. If there was an error
          *  during conversion, method returns false and can be used to check
          *  against next value.
          */
         virtual bool understand(const std::string & argv) {
-            if (!used) {
-                std::stringstream ss;
+            std::stringstream ss;
 
-                ss << argv;
-                ss >> argument;
+            ss << argv;
+            ss >> value;
 
-                if (!ss.fail()) {
-                    used = true;
-                    return true;
-                }
+            if (!ss.fail()) {
+                return true;
             }
 
             return false;