diff --git a/.travis.yml b/.travis.yml
index d3e842c..90e7c68 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,18 +5,32 @@ matrix:
   include:
     - os: linux
       env:
-        - COMPILER=g++-5 STDLIB=libc++
+        - COMPILER=g++-7
       addons:
         apt:
-          sources: ['ubuntu-toolchain-r-test', 'george-edison55-precise-backports']
-          packages: ["g++-5", "cmake-data", "cmake"]
+          sources: ['ubuntu-toolchain-r-test']
+          packages: ["g++-7", "cmake-data", "cmake"]
     - os: linux
       env:
-        - COMPILER=g++-4.8 USE_BOOST_REGEX=ON
+        - COMPILER=g++-8
       addons:
         apt:
-          sources: ['ubuntu-toolchain-r-test', 'george-edison55-precise-backports', 'boost-latest']
-          packages: ["g++-4.8", "cmake-data", "cmake", "libboost-regex1.55-dev"]
+          sources: ['ubuntu-toolchain-r-test']
+          packages: ["g++-8", "cmake-data", "cmake"]
+    - os: linux
+      env:
+        - COMPILER=g++-9
+      addons:
+        apt:
+          sources: ['ubuntu-toolchain-r-test']
+          packages: ["g++-9", "cmake-data", "cmake"]
+    - os: linux
+      env:
+        - COMPILER=g++-9 USE_BOOST_REGEX=ON
+      addons:
+        apt:
+          sources: ['ubuntu-toolchain-r-test']
+          packages: ["g++-9", "cmake-data", "cmake", "libboost-regex-dev"]
 
     - os: linux
       env:
@@ -28,41 +42,54 @@ matrix:
 
     - os: linux
       env:
-        - COMPILER=clang++-3.7 STDLIB=libc++
+        - COMPILER=clang++-8 STDLIB=libc++
       addons:
         apt:
-          sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-precise-3.7', 'george-edison55-precise-backports']
-          packages: ["clang-3.7", "cmake-data", "cmake"]
+          sources: ['ubuntu-toolchain-r-test', 'llvm-toolchain-trusty-8']
+          packages: ["clang-8", "cmake-data", "cmake"]
 
     - os: osx
-      osx_image: xcode6.4
+      osx_image: xcode9.4
       env:
-        - COMPILER=clang++ V='Apple LLVM 6.4'
-        - COMPILER=clang++ V='Apple LLVM 6.4' WITH_CPP14=true
+        - COMPILER=clang++ V='Apple LLVM 9.1'
+        - COMPILER=clang++ V='Apple LLVM 9.1' WITH_CPP14=true
 
     - os: osx
-      osx_image: xcode7
+      osx_image: xcode10.3
       env:
-        - COMPILER=clang++ V='Apple LLVM 7.0'
-        - COMPILER=clang++ V='Apple LLVM 7.0' WITH_CPP14=true
+        - COMPILER=clang++ V='Apple LLVM 10.0'
+        - COMPILER=clang++ V='Apple LLVM 10.0' WITH_CPP14=true
+    - os: osx
+      osx_image: xcode11.2
+      env:
+        - COMPILER=clang++ V='Apple LLVM 11.0'
+        - COMPILER=clang++ V='Apple LLVM 11.0' WITH_CPP14=true
+    - os: osx
+      osx_image: xcode11.2
+      env:
+        - COMPILER=clang++ V='Apple LLVM 11.0'
+        - COMPILER=clang++ V='Apple LLVM 11.0' WITH_CPP17=true
 
 before_install:
+  - CMAKE_CXX_FLAGS+=" -Wall"
   - |
-    if [[ "${TRAVIS_OS_NAME}" == "osx" ]]; then
-      brew rm --force cmake && brew install cmake
+    if [[ "${WITH_CPP14}" == "true" ]]; then
+        CMAKE_OPTIONS+=" -DCMAKE_CXX_STANDARD=14"
+    fi
+  - |
+    if [[ "${WITH_CPP17}" == "true" ]]; then
+        CMAKE_OPTIONS+=" -DCMAKE_CXX_STANDARD=17"
     fi
-
-  - CMAKE_CXX_FLAGS+=" -Wall"
-
-  - if [[ "${WITH_CPP14}" == "true" ]]; then CMAKE_OPTIONS+=" -DCMAKE_CXX_STANDARD=14"; fi
   - |
     if [[ "${USE_BOOST_REGEX}" == "ON" ]]; then
         CMAKE_OPTIONS+=" -DUSE_BOOST_REGEX=ON"
-        CMAKE_OPTIONS+=" -DBoost_REGEX_LIBRARY_DEBUG=/usr/lib/x86_64-linux-gnu/libboost_regex.so.1.55.0"
-        CMAKE_OPTIONS+=" -DBoost_REGEX_LIBRARY_RELEASE=/usr/lib/x86_64-linux-gnu/libboost_regex.so.1.55.0"
+        CMAKE_OPTIONS+=" -DBoost_REGEX_LIBRARY_DEBUG=/usr/lib/x86_64-linux-gnu/libboost_regex.so"
+        CMAKE_OPTIONS+=" -DBoost_REGEX_LIBRARY_RELEASE=/usr/lib/x86_64-linux-gnu/libboost_regex.so"
+    fi
+  - |
+    if [[ "${STDLIB}" == "libc++" ]]; then
+        CMAKE_CXX_FLAGS+=" -stdlib=libc++"
     fi
-  - if [[ "${STDLIB}" == "libc++" ]]; then CMAKE_CXX_FLAGS+=" -stdlib=libc++"; fi
-
   - ${COMPILER} --version
 
 before_script:
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ee01e7c..feff32e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 3.1)
-project(docopt.cpp VERSION 0.6.1)
+project(docopt.cpp VERSION 0.6.2)
 
 include(GNUInstallDirs)
 
@@ -20,11 +20,6 @@ if(NOT CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD LESS 11)
 	set(CMAKE_CXX_STANDARD 11)
 endif()
 
-# Suppression of "unknown pragma" warning on GCC
-if(CMAKE_COMPILER_IS_GNUCXX)
-	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-pragmas") # Code uses #pragma mark
-endif()
-
 #============================================================================
 # Sources & headers
 #============================================================================
@@ -55,6 +50,10 @@ else()
     set_target_properties(docopt_o PROPERTIES POSITION_INDEPENDENT_CODE TRUE)
 
     add_library(docopt SHARED $<TARGET_OBJECTS:docopt_o>)
+	set_target_properties(docopt PROPERTIES
+			VERSION ${PROJECT_VERSION}
+			SOVERSION ${PROJECT_VERSION_MAJOR}
+			)
     add_library(docopt_s STATIC $<TARGET_OBJECTS:docopt_o>)
 endif()
 
@@ -130,6 +129,9 @@ write_basic_package_version_file("${PROJECT_BINARY_DIR}/docopt-config-version.cm
 install(FILES docopt-config.cmake ${PROJECT_BINARY_DIR}/docopt-config-version.cmake DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/docopt")
 install(EXPORT ${export_name} DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/docopt")
 
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/docopt.pc.in ${CMAKE_CURRENT_BINARY_DIR}/docopt.pc @ONLY)
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/docopt.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
+
 #============================================================================
 # CPack
 #============================================================================
diff --git a/README.rst b/README.rst
index fc01274..5fe8b4f 100644
--- a/README.rst
+++ b/README.rst
@@ -1,5 +1,13 @@
 ``docopt.cpp``: A C++11 Port
 ============================
+
+Contents
+--------
+
+.. contents::
+  :local:
+  :depth: 3
+
 docopt creates *beautiful* command-line interfaces
 --------------------------------------------------
 
@@ -58,13 +66,40 @@ and instead can write only the help message--*the way you want it*.
 Beat that! The option parser is generated based on the docstring above
 that is passed to ``docopt::docopt`` function.  ``docopt`` parses the usage
 pattern (``"Usage: ..."``) and option descriptions (lines starting
-with dash "``-``") and ensures that the program invocation matches the
+with a dash "``-``") and ensures that the program invocation matches the
 usage pattern; it parses options, arguments and commands based on
 that. The basic idea is that *a good help message has all necessary
 information in it to make a parser*.
 
+Getting and using
+-----------------
+
+To get *docopt.cpp*, the simplest is to use `Conda <https://github.com/conda-forge/docopt.cpp-feedstock>`_::
+
+    conda install -c conda-forge docopt.cpp
+
+Alternatively manual installation is done using (unix)::
+
+    git clone
+    cmake .
+    make install
+
+To link *docopt.cpp*, the simplest is to use CMake. The general structure of your
+``CMakeLists.txt`` would be as follows::
+
+    cmake_minimum_required(VERSION 3.1)
+
+    project(example)
+
+    find_package(docopt COMPONENTS CXX REQUIRED)
+    include_directories(${DOCOPT_INCLUDE_DIRS})
+
+    add_executable(${PROJECT_NAME} ...)
+
+    target_link_libraries(${PROJECT_NAME} docopt)
+
 C++11 port details
----------------------------------------------------
+------------------
 
 This is a port of the ``docopt.py`` module (https://github.com/docopt/docopt),
 and we have tried to maintain full feature parity (and code structure) as the
@@ -80,7 +115,7 @@ to work with docopt:
 
 GCC-4.8 can work, but the std::regex module needs to be replaced with ``Boost.Regex``.
 In that case, you will need to define ``DOCTOPT_USE_BOOST_REGEX`` when compiling
-docopt, and link your code with the appropriated Boost libraries. A relativley
+docopt, and link your code with the appropriated Boost libraries. A relatively
 recent version of Boost is needed: 1.55 works, but 1.46 does not for example.
 
 This port is licensed under the MIT license, just like the original module.
@@ -101,7 +136,7 @@ The differences from the Python port are:
   some of the regex's had to be restructured and additional loops used.
 
 API
----------------------------------------------------
+---
 
 .. code:: c++
 
@@ -182,16 +217,15 @@ If any parsing error (in either the usage, or due to incorrect user inputs) is
 encountered, the program will exit with exit code -1.
 
 Note that there is another function that does not exit on error, and instead will
-propogate an exception that you can catch and process as you like. See the docopt.h file
+propagate an exception that you can catch and process as you like. See the docopt.h file
 for information on the exceptions and usage:
 
 .. code:: c++
 
     docopt::docopt_parse(doc, argv, help /* =true */, version /* =true */, options_first /* =false)
 
-
 Help message format
----------------------------------------------------
+-------------------
 
 Help message consists of 2 parts:
 
@@ -210,7 +244,7 @@ Help message consists of 2 parts:
 Their format is described below; other text is ignored.
 
 Usage pattern format
-----------------------------------------------------------------------
+--------------------
 
 **Usage pattern** is a substring of ``doc`` that starts with
 ``usage:`` (case *insensitive*) and ends with a *visibly* empty line.
@@ -263,7 +297,7 @@ Use the following constructs to specify patterns:
 - **|** (pipe) **mutually exclusive** elements. Group them using **(
   )** if one of the mutually exclusive elements is required:
   ``my_program (--clockwise | --counter-clockwise) TIME``. Group
-  them using **[ ]** if none of the mutually-exclusive elements are
+  them using **[ ]** if none of the mutually exclusive elements are
   required: ``my_program [--left | --right]``.
 - **...** (ellipsis) **one or more** elements. To specify that
   arbitrary number of repeating elements could be accepted, use
@@ -291,7 +325,7 @@ then number of occurrences of the option will be counted. I.e.
 ``args['-v']`` will be ``2`` if program was invoked as ``my_program
 -vv``. Same works for commands.
 
-If your usage patterns allows to match same-named option with argument
+If your usage pattern allows to match same-named option with argument
 or positional argument several times, the matched arguments will be
 collected into a list::
 
@@ -301,9 +335,8 @@ I.e. invoked with ``my_program file1 file2 --path=./here
 --path=./there`` the returned dict will contain ``args['<file>'] ==
 ['file1', 'file2']`` and ``args['--path'] == ['./here', './there']``.
 
-
 Option descriptions format
-----------------------------------------------------------------------
+--------------------------
 
 **Option descriptions** consist of a list of options that you put
 below your usage patterns.
@@ -328,7 +361,7 @@ The rules are as follows:
   argument after space (or equals "``=``" sign) as shown below. Follow
   either <angular-brackets> or UPPER-CASE convention for options'
   arguments.  You can use comma if you want to separate options. In
-  the example below, both lines are valid, however you are recommended
+  the example below, both lines are valid. However you are recommended
   to stick to a single style.::
 
     -o FILE --output=FILE       # without comma, with "=" sign
@@ -352,7 +385,7 @@ The rules are as follows:
 
 - If the option is not repeatable, the value inside ``[default: ...]``
   will be interpreted as string.  If it *is* repeatable, it will be
-  splited into a list on whitespace::
+  split into a list on whitespace::
 
     Usage: my_program [--repeatable=<arg> --repeatable=<arg>]
                          [--another-repeatable=<arg>]...
@@ -368,18 +401,18 @@ The rules are as follows:
     --not-repeatable=<arg>      [default: ./here ./there]
 
 Examples
-----------------------------------------------------------------------
+--------
 
 We have an extensive list of `examples
 <https://github.com/docopt/docopt/tree/master/examples>`_ which cover
 every aspect of functionality of **docopt**.  Try them out, read the
 source if in doubt.
 
-There are also very intersting applications and ideas at that page.
+There are also very interesting applications and ideas at that page.
 Check out the sister project for more information!
 
 Subparsers, multi-level help and *huge* applications (like git)
-----------------------------------------------------------------------
+---------------------------------------------------------------
 
 If you want to split your usage-pattern into several, implement
 multi-level help (with separate help-screen for each subcommand),
@@ -391,7 +424,8 @@ we implemented a subset of git command-line interface as an example:
 <https://github.com/docopt/docopt/tree/master/examples/git>`_
 
 Compiling the example / Running the tests
-----------------------------------------------------------------------
+-----------------------------------------
+
 The original Python module includes some language-agnostic unit tests,
 and these can be run with this port as well.
 
@@ -425,7 +459,7 @@ You can also compile the example shown at the start (included as example.cpp)::
   shoot: false
 
 Development
----------------------------------------------------
+-----------
 
 Comments and suggestions are *very* welcome! If you find issues, please
 file them and help improve our code!
@@ -436,7 +470,7 @@ we might want to first negotiate these changes into the Python code first.
 However, bring it up! Let's hear it!
 
 Changelog
----------------------------------------------------
+---------
 
 **docopt** follows `semantic versioning <http://semver.org>`_.  The
 first release with stable API will be 1.0.0 (soon).
diff --git a/debian/changelog b/debian/changelog
index ee20ef9..b417595 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+docopt.cpp (0.6.3-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Tue, 15 Mar 2022 21:37:32 -0000
+
 docopt.cpp (0.6.2-2) unstable; urgency=medium
 
   * Switch from git-dpm to gbp
diff --git a/debian/patches/Make-tests-compatible-with-Python-3.patch b/debian/patches/Make-tests-compatible-with-Python-3.patch
index 2b240a0..5b2f647 100644
--- a/debian/patches/Make-tests-compatible-with-Python-3.patch
+++ b/debian/patches/Make-tests-compatible-with-Python-3.patch
@@ -6,10 +6,10 @@ Subject: Make tests compatible with Python 3
  run_tests.py | 22 +++++++++++-----------
  1 file changed, 11 insertions(+), 11 deletions(-)
 
-diff --git a/run_tests.py b/run_tests.py
-index ef723b4..481b265 100755
---- a/run_tests.py
-+++ b/run_tests.py
+Index: docopt.cpp/run_tests.py
+===================================================================
+--- docopt.cpp.orig/run_tests.py
++++ docopt.cpp/run_tests.py
 @@ -1,4 +1,4 @@
 -#!/usr/bin/env python2
 +#!/usr/bin/env python3
diff --git a/debian/patches/Set-versioning-properties.patch b/debian/patches/Set-versioning-properties.patch
index 68ea921..b167e64 100644
--- a/debian/patches/Set-versioning-properties.patch
+++ b/debian/patches/Set-versioning-properties.patch
@@ -6,11 +6,11 @@ Subject: Set versioning properties
  CMakeLists.txt | 4 ++++
  1 file changed, 4 insertions(+)
 
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index ee01e7c..eaa85e5 100644
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
-@@ -75,6 +75,10 @@ if(NOT MSVC)
+Index: docopt.cpp/CMakeLists.txt
+===================================================================
+--- docopt.cpp.orig/CMakeLists.txt
++++ docopt.cpp/CMakeLists.txt
+@@ -74,6 +74,10 @@ if(NOT MSVC)
  	set_target_properties(docopt_s PROPERTIES OUTPUT_NAME docopt)
  endif()
  
diff --git a/docopt.cpp b/docopt.cpp
index e875d2f..c2c2008 100644
--- a/docopt.cpp
+++ b/docopt.cpp
@@ -54,8 +54,10 @@ std::ostream& docopt::operator<<(std::ostream& os, value const& val)
 	return os;
 }
 
+#if 0
 #pragma mark -
 #pragma mark Parsing stuff
+#endif
 
 class Tokens {
 public:
@@ -607,7 +609,7 @@ static std::pair<Required, std::vector<Option>> create_pattern_tree(std::string
 }
 
 DOCOPT_INLINE
-std::map<std::string, value>
+docopt::Options
 docopt::docopt_parse(std::string const& doc,
 		     std::vector<std::string> const& argv,
 		     bool help,
@@ -634,7 +636,7 @@ docopt::docopt_parse(std::string const& doc,
 	std::vector<std::shared_ptr<LeafPattern>> collected;
 	bool matched = pattern.fix().match(argv_patterns, collected);
 	if (matched && argv_patterns.empty()) {
-		std::map<std::string, value> ret;
+		docopt::Options ret;
 
 		// (a.name, a.value) for a in (pattern.flat() + collected)
 		for (auto* p : pattern.leaves()) {
@@ -657,7 +659,7 @@ docopt::docopt_parse(std::string const& doc,
 }
 
 DOCOPT_INLINE
-std::map<std::string, value>
+docopt::Options
 docopt::docopt(std::string const& doc,
 	       std::vector<std::string> const& argv,
 	       bool help,
diff --git a/docopt.h b/docopt.h
index 4c40741..c5ce97e 100644
--- a/docopt.h
+++ b/docopt.h
@@ -14,6 +14,7 @@
 #include <map>
 #include <vector>
 #include <string>
+#include <stdexcept>
 
 #ifdef DOCOPT_HEADER_ONLY
     #define DOCOPT_INLINE inline
@@ -53,6 +54,9 @@ namespace docopt {
 
 	// Arguments contained '--version' and parsing was aborted early
 	struct DocoptExitVersion : std::runtime_error { DocoptExitVersion() : std::runtime_error("Docopt --version argument encountered") {} };
+
+	/// A map of options set by the user
+	using Options = std::map<std::string, value>;
 	
 	/// Parse user options from the given option string.
 	///
@@ -67,7 +71,7 @@ namespace docopt {
 	/// @throws DocoptExitHelp if 'help' is true and the user has passed the '--help' argument
 	/// @throws DocoptExitVersion if 'version' is true and the user has passed the '--version' argument
 	/// @throws DocoptArgumentError if the user's argv did not match the usage patterns
-	std::map<std::string, value> DOCOPT_API docopt_parse(std::string const& doc,
+	Options DOCOPT_API docopt_parse(std::string const& doc,
 					    std::vector<std::string> const& argv,
 					    bool help = true,
 					    bool version = true,
@@ -80,7 +84,7 @@ namespace docopt {
 	///  * DocoptExitHelp - print usage string and terminate (with exit code 0)
 	///  * DocoptExitVersion - print version and terminate (with exit code 0)
 	///  * DocoptArgumentError - print error and usage string and terminate (with exit code -1)
-	std::map<std::string, value> DOCOPT_API docopt(std::string const& doc,
+	Options DOCOPT_API docopt(std::string const& doc,
 					    std::vector<std::string> const& argv,
 					    bool help = true,
 					    std::string const& version = {},
diff --git a/docopt.pc.in b/docopt.pc.in
new file mode 100644
index 0000000..0ac4ffd
--- /dev/null
+++ b/docopt.pc.in
@@ -0,0 +1,9 @@
+libdir=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_LIBDIR@
+includedir=@CMAKE_INSTALL_PREFIX@/include/docopt
+
+Name: docopt.cpp
+Description: C++11 port of docopt
+Version: @PROJECT_VERSION@
+Requires:
+Libs: -L${libdir} -ldocopt
+Cflags: -I${includedir}
diff --git a/docopt_private.h b/docopt_private.h
index 77bf2bd..931986b 100644
--- a/docopt_private.h
+++ b/docopt_private.h
@@ -322,8 +322,10 @@ namespace docopt {
 		bool match(PatternList& left, std::vector<std::shared_ptr<LeafPattern>>& collected) const override;
 	};
 
+#if 0
 #pragma mark -
 #pragma mark inline implementations
+#endif
 
 	inline std::vector<LeafPattern*> Pattern::leaves()
 	{
diff --git a/docopt_util.h b/docopt_util.h
index c9a2647..b504609 100644
--- a/docopt_util.h
+++ b/docopt_util.h
@@ -19,8 +19,10 @@ namespace std {
 #include <regex>
 #endif
 
+#if 0
 #pragma mark -
 #pragma mark General utility
+#endif
 
 namespace {
 	bool starts_with(std::string const& str, std::string const& prefix)
diff --git a/docopt_value.h b/docopt_value.h
index a923219..ff88625 100644
--- a/docopt_value.h
+++ b/docopt_value.h
@@ -13,9 +13,18 @@
 #include <vector>
 #include <functional> // std::hash
 #include <iosfwd>
+#include <stdexcept>
 
 namespace docopt {
 
+	enum class Kind {
+		Empty,
+		Bool,
+		Long,
+		String,
+		StringList
+	};
+
 	/// A generic type to hold the various types that can be produced by docopt.
 	///
 	/// This type can be one of: {bool, long, string, vector<string>}, or empty.
@@ -35,15 +44,17 @@ namespace docopt {
 		value(value&&) noexcept;
 		value& operator=(value const&);
 		value& operator=(value&&) noexcept;
+
+		Kind kind() const { return kind_; }
 		
 		// Test if this object has any contents at all
-		explicit operator bool() const { return kind != Kind::Empty; }
+		explicit operator bool() const { return kind_ != Kind::Empty; }
 		
 		// Test the type contained by this value object
-		bool isBool()       const { return kind==Kind::Bool; }
-		bool isString()     const { return kind==Kind::String; }
-		bool isLong()       const { return kind==Kind::Long; }
-		bool isStringList() const { return kind==Kind::StringList; }
+		bool isBool()       const { return kind_==Kind::Bool; }
+		bool isString()     const { return kind_==Kind::String; }
+		bool isLong()       const { return kind_==Kind::Long; }
+		bool isStringList() const { return kind_==Kind::StringList; }
 
 		// Throws std::invalid_argument if the type does not match
 		bool asBool() const;
@@ -53,19 +64,10 @@ namespace docopt {
 
 		size_t hash() const noexcept;
 		
-		// equality is based on hash-equality
 		friend bool operator==(value const&, value const&);
 		friend bool operator!=(value const&, value const&);
 
 	private:
-		enum class Kind {
-			Empty,
-			Bool,
-			Long,
-			String,
-			StringList
-		};
-		
 		union Variant {
 			Variant() {}
 			~Variant() {  /* do nothing; will be destroyed by ~value */ }
@@ -88,19 +90,18 @@ namespace docopt {
 		}
 
 		void throwIfNotKind(Kind expected) const {
-			if (kind == expected)
+			if (kind_ == expected)
 				return;
 
 			std::string error = "Illegal cast to ";
 			error += kindAsString(expected);
 			error += "; type is actually ";
-			error += kindAsString(kind);
+			error += kindAsString(kind_);
 			throw std::runtime_error(std::move(error));
 		}
 
-	private:
-		Kind kind = Kind::Empty;
-		Variant variant {};
+		Kind kind_ = Kind::Empty;
+		Variant variant_ {};
 	};
 
 	/// Write out the contents to the ostream
@@ -119,51 +120,51 @@ namespace std {
 namespace docopt {
 	inline
 	value::value(bool v)
-	: kind(Kind::Bool)
+	: kind_(Kind::Bool)
 	{
-		variant.boolValue = v;
+		variant_.boolValue = v;
 	}
 
 	inline
 	value::value(long v)
-	: kind(Kind::Long)
+	: kind_(Kind::Long)
 	{
-		variant.longValue = v;
+		variant_.longValue = v;
 	}
 
 	inline
 	value::value(std::string v)
-	: kind(Kind::String)
+	: kind_(Kind::String)
 	{
-		new (&variant.strValue) std::string(std::move(v));
+		new (&variant_.strValue) std::string(std::move(v));
 	}
 
 	inline
 	value::value(std::vector<std::string> v)
-	: kind(Kind::StringList)
+	: kind_(Kind::StringList)
 	{
-		new (&variant.strList) std::vector<std::string>(std::move(v));
+		new (&variant_.strList) std::vector<std::string>(std::move(v));
 	}
 
 	inline
 	value::value(value const& other)
-	: kind(other.kind)
+	: kind_(other.kind_)
 	{
-		switch (kind) {
+		switch (kind_) {
 			case Kind::String:
-				new (&variant.strValue) std::string(other.variant.strValue);
+				new (&variant_.strValue) std::string(other.variant_.strValue);
 				break;
 
 			case Kind::StringList:
-				new (&variant.strList) std::vector<std::string>(other.variant.strList);
+				new (&variant_.strList) std::vector<std::string>(other.variant_.strList);
 				break;
 
 			case Kind::Bool:
-				variant.boolValue = other.variant.boolValue;
+				variant_.boolValue = other.variant_.boolValue;
 				break;
 
 			case Kind::Long:
-				variant.longValue = other.variant.longValue;
+				variant_.longValue = other.variant_.longValue;
 				break;
 
 			case Kind::Empty:
@@ -174,23 +175,23 @@ namespace docopt {
 
 	inline
 	value::value(value&& other) noexcept
-	: kind(other.kind)
+	: kind_(other.kind_)
 	{
-		switch (kind) {
+		switch (kind_) {
 			case Kind::String:
-				new (&variant.strValue) std::string(std::move(other.variant.strValue));
+				new (&variant_.strValue) std::string(std::move(other.variant_.strValue));
 				break;
 
 			case Kind::StringList:
-				new (&variant.strList) std::vector<std::string>(std::move(other.variant.strList));
+				new (&variant_.strList) std::vector<std::string>(std::move(other.variant_.strList));
 				break;
 
 			case Kind::Bool:
-				variant.boolValue = other.variant.boolValue;
+				variant_.boolValue = other.variant_.boolValue;
 				break;
 
 			case Kind::Long:
-				variant.longValue = other.variant.longValue;
+				variant_.longValue = other.variant_.longValue;
 				break;
 
 			case Kind::Empty:
@@ -202,13 +203,13 @@ namespace docopt {
 	inline
 	value::~value()
 	{
-		switch (kind) {
+		switch (kind_) {
 			case Kind::String:
-				variant.strValue.~basic_string();
+				variant_.strValue.~basic_string();
 				break;
 
 			case Kind::StringList:
-				variant.strList.~vector();
+				variant_.strList.~vector();
 				break;
 
 			case Kind::Empty:
@@ -242,23 +243,23 @@ namespace docopt {
 	inline
 	size_t value::hash() const noexcept
 	{
-		switch (kind) {
+		switch (kind_) {
 			case Kind::String:
-				return std::hash<std::string>()(variant.strValue);
+				return std::hash<std::string>()(variant_.strValue);
 
 			case Kind::StringList: {
-				size_t seed = std::hash<size_t>()(variant.strList.size());
-				for(auto const& str : variant.strList) {
+				size_t seed = std::hash<size_t>()(variant_.strList.size());
+				for(auto const& str : variant_.strList) {
 					hash_combine(seed, str);
 				}
 				return seed;
 			}
 
 			case Kind::Bool:
-				return std::hash<bool>()(variant.boolValue);
+				return std::hash<bool>()(variant_.boolValue);
 
 			case Kind::Long:
-				return std::hash<long>()(variant.longValue);
+				return std::hash<long>()(variant_.longValue);
 
 			case Kind::Empty:
 			default:
@@ -270,15 +271,15 @@ namespace docopt {
 	bool value::asBool() const
 	{
 		throwIfNotKind(Kind::Bool);
-		return variant.boolValue;
+		return variant_.boolValue;
 	}
 
 	inline
 	long value::asLong() const
 	{
 		// Attempt to convert a string to a long
-		if (kind == Kind::String) {
-			const std::string& str = variant.strValue;
+		if (kind_ == Kind::String) {
+			const std::string& str = variant_.strValue;
 			std::size_t pos;
 			const long ret = stol(str, &pos); // Throws if it can't convert
 			if (pos != str.length()) {
@@ -288,43 +289,43 @@ namespace docopt {
 			return ret;
 		}
 		throwIfNotKind(Kind::Long);
-		return variant.longValue;
+		return variant_.longValue;
 	}
 
 	inline
 	std::string const& value::asString() const
 	{
 		throwIfNotKind(Kind::String);
-		return variant.strValue;
+		return variant_.strValue;
 	}
 
 	inline
 	std::vector<std::string> const& value::asStringList() const
 	{
 		throwIfNotKind(Kind::StringList);
-		return variant.strList;
+		return variant_.strList;
 	}
 
 	inline
 	bool operator==(value const& v1, value const& v2)
 	{
-		if (v1.kind != v2.kind)
+		if (v1.kind_ != v2.kind_)
 			return false;
 		
-		switch (v1.kind) {
-			case value::Kind::String:
-				return v1.variant.strValue==v2.variant.strValue;
+		switch (v1.kind_) {
+			case Kind::String:
+				return v1.variant_.strValue==v2.variant_.strValue;
 
-			case value::Kind::StringList:
-				return v1.variant.strList==v2.variant.strList;
+			case Kind::StringList:
+				return v1.variant_.strList==v2.variant_.strList;
 
-			case value::Kind::Bool:
-				return v1.variant.boolValue==v2.variant.boolValue;
+			case Kind::Bool:
+				return v1.variant_.boolValue==v2.variant_.boolValue;
 
-			case value::Kind::Long:
-				return v1.variant.longValue==v2.variant.longValue;
+			case Kind::Long:
+				return v1.variant_.longValue==v2.variant_.longValue;
 
-			case value::Kind::Empty:
+			case Kind::Empty:
 			default:
 				return true;
 		}