+ /**
+ * Method used for checking if Option understands given user value.
+ * If so current Option is flagged as used and no more checks against
+ * it will be done in future.
+ *
+ * Passed value should be in form of:
+ * OptionName=OptionValue
+ *
+ * If no equal sign is after OptionName part,
+ * std::invalid_argument exception with appropriate message is thrown
+ *
+ * If conversion of OptionValue part to OptionType failed,
+ * std::invalid_argument exception with appropriate message is thrown
+ *
+ * @param argv command line value against which test will be made.
+ * User value should be in format: OptionName=OptionValue.
+ *
+ * @return If passed argv succesfully detected OptionName part as a
+ * current option and its OptionValue part has been succesfully
+ * converted to OptionType, returns true and Option is set as used one.
+ * Otherwise returns false and can be used to check against next value.
+ *
+ * @throw std::invalid_argument when OptionName part has no equal sign
+ * after itself
+ * @throw std::invalid_argument when OptionValue part failed conversion
+ * to OptionType
+ */
+ virtual bool understand(const std::string & argv) {
+ if ((!used) &&
+ (argv.find(name) == 0)) {
+ std::size_t pos = argv.find("=");
+ if (pos != name.size()) {
+ throw std::invalid_argument("Option: " + name + " requires value but no one has been provided");
+ }
+
+ std::stringstream ss;
+
+ ss << argv.substr(pos + 1);
+ ss >> value;
+
+ if (ss.fail()) {
+ throw std::invalid_argument("Value for option: " + name + " failed conversion to the required type");
+ }
+
+ used = true;