diff --git a/README.md b/README.md
index 978fe78..417ffd9 100644
--- a/README.md
+++ b/README.md
@@ -75,8 +75,8 @@
 package main
 
 import (
-        "fmt"
-        docopt "github.com/kbatten/docopt.go"
+    "fmt"
+    docopt "github.com/kbatten/docopt.go"
 )
 
 func main() {
diff --git a/docopt.go b/docopt.go
index 2932a38..2a32110 100644
--- a/docopt.go
+++ b/docopt.go
@@ -1,10 +1,12 @@
-/*
-Based of off docopt.py: https://github.com/docopt/docopt
+// Licensed under terms of MIT license (see LICENSE-MIT)
+// Copyright (c) 2013 Keith Batten, kbatten@gmail.com
 
-Licensed under terms of MIT license (see LICENSE-MIT)
-Copyright (c) 2013 Keith Batten, kbatten@gmail.com
-*/
-
+// Package docopt creates beautiful command-line interfaces based on the
+// command help message
+//
+// Port of docopt for python
+// https://github.com/docopt/docopt
+// http://docopt.org
 package docopt
 
 import (
@@ -16,8 +18,87 @@
 	"unicode"
 )
 
+// Parse `argv` based on command-line interface described in `doc`.
+//
+// docopt creates your command-line interface based on its
+// description that you pass as `doc`. Such description can contain
+// --options, <positional-argument>, commands, which could be
+// [optional], (required), (mutually | exclusive) or repeated...
+//
+// Parameters:
+//  doc : string
+//   Description of your command-line interface.
+//
+//  argv : list of string or nil
+//   Argument vector to be parsed. os.Args[1:] is used if nil.
+//
+//  help : bool (default: true)
+//   Set to false to disable automatic help on -h or --help options.
+//
+//  version : string
+//   If set to something besides an empty string, the string will be printed
+//   if --version is in argv
+//
+//  optionsFirst : bool (default: false)
+//   Set to true to require options precede positional arguments,
+//   i.e. to forbid options and positional arguments intermix.
+//
+// Returns:
+//  args : map[string]interface{}
+//   A map, where keys are names of command-line elements
+//   such as e.g. "--verbose" and "<path>", and values are the
+//   parsed values of those elements.
+//
+//  err : error, *docopt.LanguageError, *docopt.UserError
+//
+//  os.Exit on user error or help
+//
+// Example:
+//  package main
+//
+//  import (
+//      "fmt"
+//      docopt "github.com/kbatten/docopt.go"
+//  )
+//
+//  func main() {
+//      doc := `
+//  Usage:
+//    my_program tcp <host> <port> [--timeout=<seconds>]
+//    my_program serial <port> [--baud=<n>] [--timeout=<seconds>]
+//    my_program (-h | --help | --version)
+//
+//  Options:
+//    -h, --help Show this screen and exit.
+//    --baud=<n> Baudrate [default: 9600]
+//  `
+//      argv := []string{"tcp", "127.0.0.1", "80", "--timeout", "30"}
+//      fmt.Println(docopt.Parse(doc, argv, true, "", false))
+//  }
+//
+// Example output:
+//  {"--baud": "9600",
+//   "--help": false,
+//   "--timeout": "30",
+//   "--version": false,
+//   "<host>": "127.0.0.1",
+//   "<port>": "8"',
+//   "serial": false,
+//   "tcp": true}
+func Parse(doc string, argv []string, help bool, version string, optionsFirst bool) (map[string]interface{}, error) {
+	args, output, err := parse(doc, argv, help, version, optionsFirst)
+	if _, ok := err.(*UserError); ok {
+		fmt.Println(output)
+		os.Exit(1)
+	} else if len(output) > 0 && err == nil {
+		fmt.Println(output)
+		os.Exit(0)
+	}
+	return args, err
+}
+
 // parse and return a map of args, output and all errors
-func Parse(doc string, argv []string, help bool, version string, optionsFirst bool) (args map[string]interface{}, output string, err error) {
+func parse(doc string, argv []string, help bool, version string, optionsFirst bool) (args map[string]interface{}, output string, err error) {
 	if argv == nil && len(os.Args) > 1 {
 		argv = os.Args[1:]
 	}
@@ -41,19 +122,19 @@
 		return
 	}
 
-	patternArgv, err := parseArgv(newTokenList(argv, ERROR_USER), &options, optionsFirst)
+	patternArgv, err := parseArgv(newTokenList(argv, errorUser), &options, optionsFirst)
 	if err != nil {
 		output = handleError(err, usage)
 		return
 	}
-	patFlat, err := pat.flat(PATTERN_OPTION)
+	patFlat, err := pat.flat(patternOption)
 	if err != nil {
 		output = handleError(err, usage)
 		return
 	}
 	patternOptions := patFlat.unique()
 
-	patFlat, err = pat.flat(PATTERN_OPTIONSSHORTCUT)
+	patFlat, err = pat.flat(patternOptionSSHORTCUT)
 	if err != nil {
 		output = handleError(err, usage)
 		return
@@ -74,7 +155,7 @@
 	}
 	matched, left, collected := pat.match(&patternArgv, nil)
 	if matched && len(*left) == 0 {
-		patFlat, err = pat.flat(PATTERN_DEFAULT)
+		patFlat, err = pat.flat(patternDefault)
 		if err != nil {
 			output = handleError(err, usage)
 			return
@@ -88,43 +169,6 @@
 	return
 }
 
-// parse just doc and return a map of args
-// handle all printing and non-fatal errors
-// panic on fatal errors
-// exit on user error or help
-func ParseEasy(doc string) map[string]interface{} {
-	return ParseLoud(doc, nil, true, "", false)
-}
-
-// parse and return a map of args and fatal errors
-// handle printing of help
-// exit on user error or help
-func ParseQuiet(doc string, argv []string, help bool, version string, optionsFirst bool) (map[string]interface{}, error) {
-	args, output, err := Parse(doc, argv, help, version, optionsFirst)
-	if _, ok := err.(*UserError); ok {
-		fmt.Println(output)
-		os.Exit(1)
-	} else if len(output) > 0 && err == nil {
-		fmt.Println(output)
-		os.Exit(0)
-	}
-	return args, err
-}
-
-// parse and return a map of args
-// handle all printing and non-fatal errors
-// panic on fatal errors
-// exit on user error or help
-func ParseLoud(doc string, argv []string, help bool, version string, optionsFirst bool) map[string]interface{} {
-	args, err := ParseQuiet(doc, argv, help, version, optionsFirst)
-	if _, ok := err.(*LanguageError); ok {
-		panic(fmt.Sprintf("(language) %s", err))
-	} else if err != nil {
-		panic(fmt.Sprintf("(internal) %s", err))
-	}
-	return args
-}
-
 func handleError(err error, usage string) string {
 	if _, ok := err.(*UserError); ok {
 		return strings.TrimSpace(fmt.Sprintf("%s\n%s", err, usage))
@@ -353,7 +397,7 @@
 			similar = append(similar, o)
 		}
 	}
-	if tokens.err == ERROR_USER && len(similar) == 0 { // if no exact match
+	if tokens.err == errorUser && len(similar) == 0 { // if no exact match
 		similar = patternList{}
 		for _, o := range *options {
 			if strings.HasPrefix(o.long, long) {
@@ -374,7 +418,7 @@
 		}
 		opt = newOption("", long, argcount, false)
 		*options = append(*options, opt)
-		if tokens.err == ERROR_USER {
+		if tokens.err == errorUser {
 			var val interface{}
 			if argcount > 0 {
 				val = value
@@ -400,7 +444,7 @@
 				}
 			}
 		}
-		if tokens.err == ERROR_USER {
+		if tokens.err == errorUser {
 			if value != nil {
 				opt.value = value
 			} else {
@@ -435,7 +479,7 @@
 		} else if len(similar) < 1 {
 			opt = newOption(short, "", 0, false)
 			*options = append(*options, opt)
-			if tokens.err == ERROR_USER {
+			if tokens.err == errorUser {
 				opt = newOption(short, "", 0, true)
 			}
 		} else { // why copying is necessary here?
@@ -452,7 +496,7 @@
 					left = ""
 				}
 			}
-			if tokens.err == ERROR_USER {
+			if tokens.err == errorUser {
 				if value != nil {
 					opt.value = value
 				} else {
@@ -467,16 +511,16 @@
 
 func newTokenList(source []string, err errorType) *tokenList {
 	errorFunc := newError
-	if err == ERROR_USER {
+	if err == errorUser {
 		errorFunc = newUserError
-	} else if err == ERROR_LANGUAGE {
+	} else if err == errorLanguage {
 		errorFunc = newLanguageError
 	}
 	return &tokenList{source, errorFunc, err}
 }
 
 func tokenListFromString(source string) *tokenList {
-	return newTokenList(strings.Fields(source), ERROR_USER)
+	return newTokenList(strings.Fields(source), errorUser)
 }
 
 func tokenListFromPattern(source string) *tokenList {
@@ -495,7 +539,7 @@
 			result = append(result, match[i][1])
 		}
 	}
-	return newTokenList(result, ERROR_LANGUAGE)
+	return newTokenList(result, errorLanguage)
 }
 
 func formalUsage(section string) string {
@@ -536,16 +580,16 @@
 type errorType int
 
 const (
-	ERROR_USER errorType = iota
-	ERROR_LANGUAGE
+	errorUser errorType = iota
+	errorLanguage
 )
 
 func (self errorType) String() string {
 	switch self {
-	case ERROR_USER:
-		return "userError"
-	case ERROR_LANGUAGE:
-		return "languageError"
+	case errorUser:
+		return "errorUser"
+	case errorLanguage:
+		return "errorLanguage"
 	}
 	return ""
 }
@@ -651,54 +695,54 @@
 
 const (
 	// leaf
-	PATTERN_ARGUMENT patternType = 1 << iota
-	PATTERN_COMMAND
-	PATTERN_OPTION
+	patternArgument patternType = 1 << iota
+	patternCommand
+	patternOption
 
 	// branch
-	PATTERN_REQUIRED
-	PATTERN_OPTIONAL
-	PATTERN_OPTIONSSHORTCUT // Marker/placeholder for [options] shortcut.
-	PATTERN_ONEORMORE
-	PATTERN_EITHER
+	patternRequired
+	patternOptionAL
+	patternOptionSSHORTCUT // Marker/placeholder for [options] shortcut.
+	patternOneOrMore
+	patternEither
 
-	PATTERN_LEAF = PATTERN_ARGUMENT +
-		PATTERN_COMMAND +
-		PATTERN_OPTION
-	PATTERN_BRANCH = PATTERN_REQUIRED +
-		PATTERN_OPTIONAL +
-		PATTERN_OPTIONSSHORTCUT +
-		PATTERN_ONEORMORE +
-		PATTERN_EITHER
-	PATTERN_ALL     = PATTERN_LEAF + PATTERN_BRANCH
-	PATTERN_DEFAULT = 0
+	patternLeaf = patternArgument +
+		patternCommand +
+		patternOption
+	patternBranch = patternRequired +
+		patternOptionAL +
+		patternOptionSSHORTCUT +
+		patternOneOrMore +
+		patternEither
+	patternAll     = patternLeaf + patternBranch
+	patternDefault = 0
 )
 
 func (self patternType) String() string {
 	switch self {
-	case PATTERN_ARGUMENT:
+	case patternArgument:
 		return "argument"
-	case PATTERN_COMMAND:
+	case patternCommand:
 		return "command"
-	case PATTERN_OPTION:
+	case patternOption:
 		return "option"
-	case PATTERN_REQUIRED:
+	case patternRequired:
 		return "required"
-	case PATTERN_OPTIONAL:
+	case patternOptionAL:
 		return "optional"
-	case PATTERN_OPTIONSSHORTCUT:
+	case patternOptionSSHORTCUT:
 		return "optionsshortcut"
-	case PATTERN_ONEORMORE:
+	case patternOneOrMore:
 		return "oneormore"
-	case PATTERN_EITHER:
+	case patternEither:
 		return "either"
-	case PATTERN_LEAF:
+	case patternLeaf:
 		return "leaf"
-	case PATTERN_BRANCH:
+	case patternBranch:
 		return "branch"
-	case PATTERN_ALL:
+	case patternAll:
 		return "all"
-	case PATTERN_DEFAULT:
+	case patternDefault:
 		return "default"
 	}
 	return ""
@@ -728,24 +772,24 @@
 }
 
 func newRequired(pl ...*pattern) *pattern {
-	return newBranchPattern(PATTERN_REQUIRED, pl...)
+	return newBranchPattern(patternRequired, pl...)
 }
 
 func newEither(pl ...*pattern) *pattern {
-	return newBranchPattern(PATTERN_EITHER, pl...)
+	return newBranchPattern(patternEither, pl...)
 }
 
 func newOneOrMore(pl ...*pattern) *pattern {
-	return newBranchPattern(PATTERN_ONEORMORE, pl...)
+	return newBranchPattern(patternOneOrMore, pl...)
 }
 
 func newOptional(pl ...*pattern) *pattern {
-	return newBranchPattern(PATTERN_OPTIONAL, pl...)
+	return newBranchPattern(patternOptionAL, pl...)
 }
 
 func newOptionsShortcut() *pattern {
 	var p pattern
-	p.t = PATTERN_OPTIONSSHORTCUT
+	p.t = patternOptionSSHORTCUT
 	return &p
 }
 
@@ -760,13 +804,13 @@
 
 func newArgument(name string, value interface{}) *pattern {
 	// default: value=nil
-	return newLeafPattern(PATTERN_ARGUMENT, name, value)
+	return newLeafPattern(patternArgument, name, value)
 }
 
 func newCommand(name string, value interface{}) *pattern {
 	// default: value=false
 	var p pattern
-	p.t = PATTERN_COMMAND
+	p.t = patternCommand
 	p.name = name
 	p.value = value
 	return &p
@@ -775,7 +819,7 @@
 func newOption(short, long string, argcount int, value interface{}) *pattern {
 	// default: "", "", 0, false
 	var p pattern
-	p.t = PATTERN_OPTION
+	p.t = patternOption
 	p.short = short
 	p.long = long
 	if long != "" {
@@ -793,9 +837,9 @@
 }
 
 func (self *pattern) flat(types patternType) (patternList, error) {
-	if self.t&PATTERN_LEAF != 0 {
-		if types == PATTERN_DEFAULT {
-			types = PATTERN_ALL
+	if self.t&patternLeaf != 0 {
+		if types == patternDefault {
+			types = patternAll
 		}
 		if self.t&types != 0 {
 			return patternList{self}, nil
@@ -803,7 +847,7 @@
 		return patternList{}, nil
 	}
 
-	if self.t&PATTERN_BRANCH != 0 {
+	if self.t&patternBranch != 0 {
 		if self.t&types != 0 {
 			return patternList{self}, nil
 		}
@@ -831,18 +875,18 @@
 
 func (self *pattern) fixIdentities(uniq patternList) error {
 	// Make pattern-tree tips point to same object if they are equal.
-	if self.t&PATTERN_BRANCH == 0 {
+	if self.t&patternBranch == 0 {
 		return nil
 	}
 	if uniq == nil {
-		selfFlat, err := self.flat(PATTERN_DEFAULT)
+		selfFlat, err := self.flat(patternDefault)
 		if err != nil {
 			return err
 		}
 		uniq = selfFlat.unique()
 	}
 	for i, child := range self.children {
-		if child.t&PATTERN_BRANCH == 0 {
+		if child.t&patternBranch == 0 {
 			ind, err := uniq.index(child)
 			if err != nil {
 				return err
@@ -873,7 +917,7 @@
 			}
 		}
 		for _, e := range casMultiple {
-			if e.t == PATTERN_ARGUMENT || e.t == PATTERN_OPTION && e.argcount > 0 {
+			if e.t == patternArgument || e.t == patternOption && e.argcount > 0 {
 				switch e.value.(type) {
 				case string:
 					e.value = strings.Fields(e.value.(string))
@@ -882,7 +926,7 @@
 					e.value = []string{}
 				}
 			}
-			if e.t == PATTERN_COMMAND || e.t == PATTERN_OPTION && e.argcount == 0 {
+			if e.t == patternCommand || e.t == patternOption && e.argcount == 0 {
 				e.value = 0
 			}
 		}
@@ -893,7 +937,7 @@
 	if collected == nil {
 		collected = &patternList{}
 	}
-	if self.t&PATTERN_REQUIRED != 0 {
+	if self.t&patternRequired != 0 {
 		l := left
 		c := collected
 		for _, p := range self.children {
@@ -904,12 +948,12 @@
 			}
 		}
 		return true, l, c
-	} else if self.t&PATTERN_OPTIONAL != 0 || self.t&PATTERN_OPTIONSSHORTCUT != 0 {
+	} else if self.t&patternOptionAL != 0 || self.t&patternOptionSSHORTCUT != 0 {
 		for _, p := range self.children {
 			_, left, collected = p.match(left, collected)
 		}
 		return true, left, collected
-	} else if self.t&PATTERN_ONEORMORE != 0 {
+	} else if self.t&patternOneOrMore != 0 {
 		if len(self.children) != 1 {
 			panic("OneOrMore.match(): assert len(self.children) == 1")
 		}
@@ -933,7 +977,7 @@
 			return true, l, c
 		}
 		return false, left, collected
-	} else if self.t&PATTERN_EITHER != 0 {
+	} else if self.t&patternEither != 0 {
 		type outcomeStruct struct {
 			matched   bool
 			left      *patternList
@@ -959,7 +1003,7 @@
 			return outcomes[minIndex].matched, outcomes[minIndex].left, outcomes[minIndex].collected
 		}
 		return false, left, collected
-	} else if self.t&PATTERN_LEAF != 0 {
+	} else if self.t&patternLeaf != 0 {
 		pos, match := self.singleMatch(left)
 		var increment interface{}
 		if match == nil {
@@ -1013,16 +1057,16 @@
 }
 
 func (self *pattern) singleMatch(left *patternList) (int, *pattern) {
-	if self.t&PATTERN_ARGUMENT != 0 {
+	if self.t&patternArgument != 0 {
 		for n, p := range *left {
-			if p.t&PATTERN_ARGUMENT != 0 {
+			if p.t&patternArgument != 0 {
 				return n, newArgument(self.name, p.value)
 			}
 		}
 		return -1, nil
-	} else if self.t&PATTERN_COMMAND != 0 {
+	} else if self.t&patternCommand != 0 {
 		for n, p := range *left {
-			if p.t&PATTERN_ARGUMENT != 0 {
+			if p.t&patternArgument != 0 {
 				if p.value == self.name {
 					return n, newCommand(self.name, true)
 				} else {
@@ -1031,7 +1075,7 @@
 			}
 		}
 		return -1, nil
-	} else if self.t&PATTERN_OPTION != 0 {
+	} else if self.t&patternOption != 0 {
 		for n, p := range *left {
 			if self.name == p.name {
 				return n, p
@@ -1044,11 +1088,11 @@
 }
 
 func (self *pattern) String() string {
-	if self.t&PATTERN_OPTION != 0 {
+	if self.t&patternOption != 0 {
 		return fmt.Sprintf("%s(%s, %s, %d, %+v)", self.t, self.short, self.long, self.argcount, self.value)
-	} else if self.t&PATTERN_LEAF != 0 {
+	} else if self.t&patternLeaf != 0 {
 		return fmt.Sprintf("%s(%s, %+v)", self.t, self.name, self.value)
-	} else if self.t&PATTERN_BRANCH != 0 {
+	} else if self.t&patternBranch != 0 {
 		result := ""
 		for i, child := range self.children {
 			if i > 0 {
@@ -1071,11 +1115,11 @@
 	*/
 	result := []patternList{}
 	groups := []patternList{patternList{self}}
-	parents := PATTERN_REQUIRED +
-		PATTERN_OPTIONAL +
-		PATTERN_OPTIONSSHORTCUT +
-		PATTERN_EITHER +
-		PATTERN_ONEORMORE
+	parents := patternRequired +
+		patternOptionAL +
+		patternOptionSSHORTCUT +
+		patternEither +
+		patternOneOrMore
 	for len(groups) > 0 {
 		children := groups[0]
 		groups = groups[1:]
@@ -1088,14 +1132,14 @@
 		}
 		if child != nil {
 			children.remove(child)
-			if child.t&PATTERN_EITHER != 0 {
+			if child.t&patternEither != 0 {
 				for _, c := range child.children {
 					r := patternList{}
 					r = append(r, c)
 					r = append(r, children...)
 					groups = append(groups, r)
 				}
-			} else if child.t&PATTERN_ONEORMORE != 0 {
+			} else if child.t&patternOneOrMore != 0 {
 				r := patternList{}
 				r = append(r, child.children.double()...)
 				r = append(r, children...)
@@ -1206,13 +1250,13 @@
 // returns true if all cased characters in the string are uppercase
 // and there are there is at least one cased charcter
 func isStringUppercase(s string) bool {
-    if strings.ToUpper(s) != s {
-        return false
-    }
-    for _, c := range []rune(s) {
-        if unicode.IsUpper(c) {
-            return true
-        }
-    }
-    return false
+	if strings.ToUpper(s) != s {
+		return false
+	}
+	for _, c := range []rune(s) {
+		if unicode.IsUpper(c) {
+			return true
+		}
+	}
+	return false
 }
diff --git a/docopt_test.go b/docopt_test.go
index 848ee02..4cdc6ac 100644
--- a/docopt_test.go
+++ b/docopt_test.go
@@ -28,7 +28,7 @@
 	p, err := newRequired(
 		newOneOrMore(newArgument("N", nil)),
 		newOption("-a", "", 0, false),
-		newArgument("M", nil)).flat(PATTERN_DEFAULT)
+		newArgument("M", nil)).flat(patternDefault)
 	if reflect.DeepEqual(p, q) != true {
 		t.Error(err)
 	}
@@ -36,7 +36,7 @@
 	q = patternList{newOptionsShortcut()}
 	p, err = newRequired(
 		newOptional(newOptionsShortcut()),
-		newOptional(newOption("-a", "", 0, false))).flat(PATTERN_OPTIONSSHORTCUT)
+		newOptional(newOption("-a", "", 0, false))).flat(patternOptionSSHORTCUT)
 	if reflect.DeepEqual(p, q) != true {
 		t.Error(err)
 	}
@@ -119,25 +119,25 @@
 }
 
 func TestCommands(t *testing.T) {
-	if v, _, err := Parse("Usage: prog add", []string{"add"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"add": true}) != true {
+	if v, _, err := parse("Usage: prog add", []string{"add"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"add": true}) != true {
 		t.Error(err)
 	}
-	if v, _, err := Parse("Usage: prog [add]", []string{}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"add": false}) != true {
+	if v, _, err := parse("Usage: prog [add]", []string{}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"add": false}) != true {
 		t.Error(err)
 	}
-	if v, _, err := Parse("Usage: prog [add]", []string{"add"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"add": true}) != true {
+	if v, _, err := parse("Usage: prog [add]", []string{"add"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"add": true}) != true {
 		t.Error(err)
 	}
-	if v, _, err := Parse("Usage: prog (add|rm)", []string{"add"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"add": true, "rm": false}) != true {
+	if v, _, err := parse("Usage: prog (add|rm)", []string{"add"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"add": true, "rm": false}) != true {
 		t.Error(err)
 	}
-	if v, _, err := Parse("Usage: prog (add|rm)", []string{"rm"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"add": false, "rm": true}) != true {
+	if v, _, err := parse("Usage: prog (add|rm)", []string{"rm"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"add": false, "rm": true}) != true {
 		t.Error(err)
 	}
-	if v, _, err := Parse("Usage: prog a b", []string{"a", "b"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"a": true, "b": true}) != true {
+	if v, _, err := parse("Usage: prog a b", []string{"a", "b"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"a": true, "b": true}) != true {
 		t.Error(err)
 	}
-	_, _, err := Parse("Usage: prog a b", []string{"b", "a"}, true, "", false)
+	_, _, err := parse("Usage: prog a b", []string{"b", "a"}, true, "", false)
 	if _, ok := err.(*UserError); !ok {
 		t.Error(err)
 	}
@@ -1060,29 +1060,29 @@
 }
 
 func TestLongOptionsErrorHandling(t *testing.T) {
-	_, _, err := Parse("Usage: prog", []string{"--non-existent"}, true, "", false)
+	_, _, err := parse("Usage: prog", []string{"--non-existent"}, true, "", false)
 	if _, ok := err.(*UserError); !ok {
 		t.Error(fmt.Sprintf("(%s) %s", reflect.TypeOf(err), err))
 	}
-	_, _, err = Parse("Usage: prog [--version --verbose]\nOptions: --version\n --verbose",
+	_, _, err = parse("Usage: prog [--version --verbose]\nOptions: --version\n --verbose",
 		[]string{"--ver"}, true, "", false)
 	if _, ok := err.(*UserError); !ok {
 		t.Error(err)
 	}
-	_, _, err = Parse("Usage: prog --long\nOptions: --long ARG", []string{}, true, "", false)
+	_, _, err = parse("Usage: prog --long\nOptions: --long ARG", []string{}, true, "", false)
 	if _, ok := err.(*LanguageError); !ok {
 		t.Error(err)
 	}
-	_, _, err = Parse("Usage: prog --long ARG\nOptions: --long ARG",
+	_, _, err = parse("Usage: prog --long ARG\nOptions: --long ARG",
 		[]string{"--long"}, true, "", false)
 	if _, ok := err.(*UserError); !ok {
 		t.Error(fmt.Sprintf("(%s) %s", reflect.TypeOf(err), err))
 	}
-	_, _, err = Parse("Usage: prog --long=ARG\nOptions: --long", []string{}, true, "", false)
+	_, _, err = parse("Usage: prog --long=ARG\nOptions: --long", []string{}, true, "", false)
 	if _, ok := err.(*LanguageError); !ok {
 		t.Error(err)
 	}
-	_, _, err = Parse("Usage: prog --long\nOptions: --long",
+	_, _, err = parse("Usage: prog --long\nOptions: --long",
 		[]string{}, true, "--long=ARG", false)
 	if _, ok := err.(*UserError); !ok {
 		t.Error(err)
@@ -1090,43 +1090,43 @@
 }
 
 func TestShortOptionsErrorHandling(t *testing.T) {
-	_, _, err := Parse("Usage: prog -x\nOptions: -x  this\n -x  that", []string{}, true, "", false)
+	_, _, err := parse("Usage: prog -x\nOptions: -x  this\n -x  that", []string{}, true, "", false)
 	if _, ok := err.(*LanguageError); !ok {
 		t.Error(fmt.Sprintf("(%s) %s", reflect.TypeOf(err), err))
 	}
-	_, _, err = Parse("Usage: prog", []string{"-x"}, true, "", false)
+	_, _, err = parse("Usage: prog", []string{"-x"}, true, "", false)
 	if _, ok := err.(*UserError); !ok {
 		t.Error(err)
 	}
-	_, _, err = Parse("Usage: prog -o\nOptions: -o ARG", []string{}, true, "", false)
+	_, _, err = parse("Usage: prog -o\nOptions: -o ARG", []string{}, true, "", false)
 	if _, ok := err.(*LanguageError); !ok {
 		t.Error(err)
 	}
-	_, _, err = Parse("Usage: prog -o ARG\nOptions: -o ARG", []string{"-o"}, true, "", false)
+	_, _, err = parse("Usage: prog -o ARG\nOptions: -o ARG", []string{"-o"}, true, "", false)
 	if _, ok := err.(*UserError); !ok {
 		t.Error(err)
 	}
 }
 
 func TestMatchingParen(t *testing.T) {
-	_, _, err := Parse("Usage: prog [a [b]", []string{}, true, "", false)
+	_, _, err := parse("Usage: prog [a [b]", []string{}, true, "", false)
 	if _, ok := err.(*LanguageError); !ok {
 		t.Error(err)
 	}
-	_, _, err = Parse("Usage: prog [a [b] ] c )", []string{}, true, "", false)
+	_, _, err = parse("Usage: prog [a [b] ] c )", []string{}, true, "", false)
 	if _, ok := err.(*LanguageError); !ok {
 		t.Error(err)
 	}
 }
 
 func TestAllowDoubleDash(t *testing.T) {
-	if v, _, err := Parse("usage: prog [-o] [--] <arg>\noptions: -o", []string{"--", "-o"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-o": false, "<arg>": "-o", "--": true}) != true {
+	if v, _, err := parse("usage: prog [-o] [--] <arg>\noptions: -o", []string{"--", "-o"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-o": false, "<arg>": "-o", "--": true}) != true {
 		t.Error(err)
 	}
-	if v, _, err := Parse("usage: prog [-o] [--] <arg>\noptions: -o", []string{"-o", "1"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-o": true, "<arg>": "1", "--": false}) != true {
+	if v, _, err := parse("usage: prog [-o] [--] <arg>\noptions: -o", []string{"-o", "1"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-o": true, "<arg>": "1", "--": false}) != true {
 		t.Error(err)
 	}
-	_, _, err := Parse("usage: prog [-o] <arg>\noptions:-o", []string{"-o"}, true, "", false)
+	_, _, err := parse("usage: prog [-o] <arg>\noptions:-o", []string{"-o"}, true, "", false)
 	if _, ok := err.(*UserError); !ok { //"--" is not allowed; FIXME?
 		t.Error(err)
 	}
@@ -1136,10 +1136,10 @@
 	doc := `Usage: prog [-v] A
 
                 Options: -v  Be verbose.`
-	if v, _, err := Parse(doc, []string{"arg"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": false, "A": "arg"}) != true {
+	if v, _, err := parse(doc, []string{"arg"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": false, "A": "arg"}) != true {
 		t.Error(err)
 	}
-	if v, _, err := Parse(doc, []string{"-v", "arg"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": true, "A": "arg"}) != true {
+	if v, _, err := parse(doc, []string{"-v", "arg"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": true, "A": "arg"}) != true {
 		t.Error(err)
 	}
 
@@ -1154,44 +1154,44 @@
       --help
 
     `
-	if v, _, err := Parse(doc, []string{"-v", "file.py"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": true, "-q": false, "-r": false, "--help": false, "FILE": "file.py", "INPUT": nil, "OUTPUT": nil}) != true {
+	if v, _, err := parse(doc, []string{"-v", "file.py"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": true, "-q": false, "-r": false, "--help": false, "FILE": "file.py", "INPUT": nil, "OUTPUT": nil}) != true {
 		t.Error(err)
 	}
-	if v, _, err := Parse(doc, []string{"-v"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": true, "-q": false, "-r": false, "--help": false, "FILE": nil, "INPUT": nil, "OUTPUT": nil}) != true {
+	if v, _, err := parse(doc, []string{"-v"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": true, "-q": false, "-r": false, "--help": false, "FILE": nil, "INPUT": nil, "OUTPUT": nil}) != true {
 		t.Error(err)
 	}
 
-	_, _, err := Parse(doc, []string{"-v", "input.py", "output.py"}, true, "", false) // does not match
+	_, _, err := parse(doc, []string{"-v", "input.py", "output.py"}, true, "", false) // does not match
 	if _, ok := err.(*UserError); !ok {
 		t.Error(err)
 	}
-	_, _, err = Parse(doc, []string{"--fake"}, true, "", false)
+	_, _, err = parse(doc, []string{"--fake"}, true, "", false)
 	if _, ok := err.(*UserError); !ok {
 		t.Error(err)
 	}
-	_, output, err := Parse(doc, []string{"--hel"}, true, "", false)
+	_, output, err := parse(doc, []string{"--hel"}, true, "", false)
 	if err != nil || len(output) == 0 {
 		t.Error(err)
 	}
 }
 
 func TestLanguageErrors(t *testing.T) {
-	_, _, err := Parse("no usage with colon here", []string{}, true, "", false)
+	_, _, err := parse("no usage with colon here", []string{}, true, "", false)
 	if _, ok := err.(*LanguageError); !ok {
 		t.Error(err)
 	}
-	_, _, err = Parse("usage: here \n\n and again usage: here", []string{}, true, "", false)
+	_, _, err = parse("usage: here \n\n and again usage: here", []string{}, true, "", false)
 	if _, ok := err.(*LanguageError); !ok {
 		t.Error(err)
 	}
 }
 
 func TestIssue40(t *testing.T) {
-	_, output, err := Parse("usage: prog --help-commands | --help", []string{"--help"}, true, "", false)
+	_, output, err := parse("usage: prog --help-commands | --help", []string{"--help"}, true, "", false)
 	if err != nil || len(output) == 0 {
 		t.Error(err)
 	}
-	if v, _, err := Parse("usage: prog --aabb | --aa", []string{"--aa"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"--aabb": false, "--aa": true}) != true {
+	if v, _, err := parse("usage: prog --aabb | --aa", []string{"--aa"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"--aabb": false, "--aa": true}) != true {
 		t.Error(err)
 	}
 }
@@ -1201,51 +1201,51 @@
 }
 
 func TestCountMultipleFlags(t *testing.T) {
-	if v, _, err := Parse("usage: prog [-v]", []string{"-v"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": true}) != true {
+	if v, _, err := parse("usage: prog [-v]", []string{"-v"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": true}) != true {
 		t.Error(err)
 	}
-	if v, _, err := Parse("usage: prog [-vv]", nil, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": 0}) != true {
+	if v, _, err := parse("usage: prog [-vv]", nil, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": 0}) != true {
 		t.Error(err)
 	}
-	if v, _, err := Parse("usage: prog [-vv]", []string{"-v"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": 1}) != true {
+	if v, _, err := parse("usage: prog [-vv]", []string{"-v"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": 1}) != true {
 		t.Error(err)
 	}
-	if v, _, err := Parse("usage: prog [-vv]", []string{"-vv"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": 2}) != true {
+	if v, _, err := parse("usage: prog [-vv]", []string{"-vv"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": 2}) != true {
 		t.Error(err)
 	}
-	_, _, err := Parse("usage: prog [-vv]", []string{"-vvv"}, true, "", false)
+	_, _, err := parse("usage: prog [-vv]", []string{"-vvv"}, true, "", false)
 	if _, ok := err.(*UserError); !ok {
 		t.Error(err)
 	}
-	if v, _, err := Parse("usage: prog [-v | -vv | -vvv]", []string{"-vvv"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": 3}) != true {
+	if v, _, err := parse("usage: prog [-v | -vv | -vvv]", []string{"-vvv"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": 3}) != true {
 		t.Error(err)
 	}
-	if v, _, err := Parse("usage: prog [-v...]", []string{"-vvvvvv"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": 6}) != true {
+	if v, _, err := parse("usage: prog [-v...]", []string{"-vvvvvv"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-v": 6}) != true {
 		t.Error(err)
 	}
-	if v, _, err := Parse("usage: prog [--ver --ver]", []string{"--ver", "--ver"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"--ver": 2}) != true {
+	if v, _, err := parse("usage: prog [--ver --ver]", []string{"--ver", "--ver"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"--ver": 2}) != true {
 		t.Error(err)
 	}
 }
 
 func TestAnyOptionsParameter(t *testing.T) {
-	_, _, err := Parse("usage: prog [options]",
+	_, _, err := parse("usage: prog [options]",
 		[]string{"-foo", "--bar", "--spam=eggs"}, true, "", false)
 	if _, ok := err.(*UserError); !ok {
 		t.Error()
 	}
 
-	_, _, err = Parse("usage: prog [options]",
+	_, _, err = parse("usage: prog [options]",
 		[]string{"--foo", "--bar", "--bar"}, true, "", false)
 	if _, ok := err.(*UserError); !ok {
 		t.Error()
 	}
-	_, _, err = Parse("usage: prog [options]",
+	_, _, err = parse("usage: prog [options]",
 		[]string{"--bar", "--bar", "--bar", "-ffff"}, true, "", false)
 	if _, ok := err.(*UserError); !ok {
 		t.Error()
 	}
-	_, _, err = Parse("usage: prog [options]",
+	_, _, err = parse("usage: prog [options]",
 		[]string{"--long=arg", "--long=another"}, true, "", false)
 	if _, ok := err.(*UserError); !ok {
 		t.Error()
@@ -1253,45 +1253,45 @@
 }
 
 func TestDefaultValueForPositionalArguments(t *testing.T) {
-	if v, _, err := Parse("usage: prog [<p>]\n\n<p>  [default: x]", []string{}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"<p>": nil}) != true {
+	if v, _, err := parse("usage: prog [<p>]\n\n<p>  [default: x]", []string{}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"<p>": nil}) != true {
 		t.Error(err)
 	}
 
-	if v, _, err := Parse("usage: prog [<p>]...\n\n<p>  [default: x y]", []string{}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"<p>": []string{}}) != true {
+	if v, _, err := parse("usage: prog [<p>]...\n\n<p>  [default: x y]", []string{}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"<p>": []string{}}) != true {
 		t.Error(err)
 	}
 
-	if v, _, err := Parse("usage: prog [<p>]...\n\n<p>  [default: x y]", []string{"this"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"<p>": []string{"this"}}) != true {
+	if v, _, err := parse("usage: prog [<p>]...\n\n<p>  [default: x y]", []string{"this"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"<p>": []string{"this"}}) != true {
 		t.Error(err)
 	}
 }
 
 func TestIssue59(t *testing.T) {
-	if v, _, err := Parse("usage: prog --long=<a>", []string{"--long="}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"--long": ""}) != true {
+	if v, _, err := parse("usage: prog --long=<a>", []string{"--long="}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"--long": ""}) != true {
 		t.Error(err)
 	}
 
-	if v, _, err := Parse("usage: prog -l <a>\noptions: -l <a>", []string{"-l", ""}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-l": ""}) != true {
+	if v, _, err := parse("usage: prog -l <a>\noptions: -l <a>", []string{"-l", ""}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"-l": ""}) != true {
 		t.Error(err)
 	}
 }
 
 func TestOptionsFirst(t *testing.T) {
-	if v, _, err := Parse("usage: prog [--opt] [<args>...]", []string{"--opt", "this", "that"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"--opt": true, "<args>": []string{"this", "that"}}) != true {
+	if v, _, err := parse("usage: prog [--opt] [<args>...]", []string{"--opt", "this", "that"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"--opt": true, "<args>": []string{"this", "that"}}) != true {
 		t.Error(err)
 	}
 
-	if v, _, err := Parse("usage: prog [--opt] [<args>...]", []string{"this", "that", "--opt"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"--opt": true, "<args>": []string{"this", "that"}}) != true {
+	if v, _, err := parse("usage: prog [--opt] [<args>...]", []string{"this", "that", "--opt"}, true, "", false); reflect.DeepEqual(v, map[string]interface{}{"--opt": true, "<args>": []string{"this", "that"}}) != true {
 		t.Error(err)
 	}
 
-	if v, _, err := Parse("usage: prog [--opt] [<args>...]", []string{"this", "that", "--opt"}, true, "", true); reflect.DeepEqual(v, map[string]interface{}{"--opt": false, "<args>": []string{"this", "that", "--opt"}}) != true {
+	if v, _, err := parse("usage: prog [--opt] [<args>...]", []string{"this", "that", "--opt"}, true, "", true); reflect.DeepEqual(v, map[string]interface{}{"--opt": false, "<args>": []string{"this", "that", "--opt"}}) != true {
 		t.Error(err)
 	}
 }
 
 func TestIssue68OptionsShortcutDoesNotIncludeOptionsInUsagePattern(t *testing.T) {
-	args, _, err := Parse("usage: prog [-ab] [options]\noptions: -x\n -y", []string{"-ax"}, true, "", false)
+	args, _, err := parse("usage: prog [-ab] [options]\noptions: -x\n -y", []string{"-ax"}, true, "", false)
 
 	if args["-a"] != true {
 		t.Error(err)
@@ -1309,14 +1309,14 @@
 
 func TestIssue65EvaluateArgvWhenCalledNotWhenImported(t *testing.T) {
 	os.Args = strings.Fields("prog -a")
-	v, _, err := Parse("usage: prog [-ab]", nil, true, "", false)
+	v, _, err := parse("usage: prog [-ab]", nil, true, "", false)
 	w := map[string]interface{}{"-a": true, "-b": false}
 	if reflect.DeepEqual(v, w) != true {
 		t.Error(err)
 	}
 
 	os.Args = strings.Fields("prog -b")
-	v, _, err = Parse("usage: prog [-ab]", nil, true, "", false)
+	v, _, err = parse("usage: prog [-ab]", nil, true, "", false)
 	w = map[string]interface{}{"-a": false, "-b": true}
 	if reflect.DeepEqual(v, w) != true {
 		t.Error(err)
@@ -1324,13 +1324,13 @@
 }
 
 func TestIssue71DoubleDashIsNotAValidOptionArgument(t *testing.T) {
-	_, _, err := Parse("usage: prog [--log=LEVEL] [--] <args>...",
+	_, _, err := parse("usage: prog [--log=LEVEL] [--] <args>...",
 		[]string{"--log", "--", "1", "2"}, true, "", false)
 	if _, ok := err.(*UserError); !ok {
 		t.Error()
 	}
 
-	_, _, err = Parse(`usage: prog [-l LEVEL] [--] <args>...
+	_, _, err = parse(`usage: prog [-l LEVEL] [--] <args>...
                   options: -l LEVEL`, []string{"-l", "--", "1", "2"}, true, "", false)
 	if _, ok := err.(*UserError); !ok {
 		t.Error()
@@ -1411,7 +1411,7 @@
 			t.Fatal(err)
 			break
 		}
-		result, _, err := Parse(c.doc, c.argv, true, "", false)
+		result, _, err := parse(c.doc, c.argv, true, "", false)
 		if _, ok := err.(*UserError); c.userError && !ok {
 			// expected a user-error
 			t.Error("testcase:", c.id, "result:", result)
@@ -1425,32 +1425,31 @@
 }
 
 func TestFileTestcasesGo(t *testing.T) {
-    filename := "test_golang.docopt"
-    file, err := os.Open(filename)
-    if err != nil {
-        t.Fatal(err)
-    }
-    defer file.Close()
+	filename := "test_golang.docopt"
+	file, err := os.Open(filename)
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer file.Close()
 
-    for c := range parseTest(file) {
-        if c.err != nil {
-            t.Fatal(err)
-            break
-        }
-        result, _, err := Parse(c.doc, c.argv, true, "", false)
-        if _, ok := err.(*UserError); c.userError && !ok {
-            // expected a user-error
-            t.Error("testcase:", c.id, "result:", result)
-        } else if _, ok := err.(*UserError); !c.userError && ok {
-            // unexpected user-error
-            t.Error("testcase:", c.id, "error:", err, "result:", result)
-        } else if reflect.DeepEqual(c.expect, result) != true {
-            t.Error("testcase:", c.id, "result:", result)
-        }
-    }
+	for c := range parseTest(file) {
+		if c.err != nil {
+			t.Fatal(err)
+			break
+		}
+		result, _, err := parse(c.doc, c.argv, true, "", false)
+		if _, ok := err.(*UserError); c.userError && !ok {
+			// expected a user-error
+			t.Error("testcase:", c.id, "result:", result)
+		} else if _, ok := err.(*UserError); !c.userError && ok {
+			// unexpected user-error
+			t.Error("testcase:", c.id, "error:", err, "result:", result)
+		} else if reflect.DeepEqual(c.expect, result) != true {
+			t.Error("testcase:", c.id, "result:", result)
+		}
+	}
 }
 
-
 type testcase struct {
 	id        int
 	doc       string
diff --git a/examples/naval_fate.go b/examples/naval_fate.go
index 4756d57..d3d0d36 100644
--- a/examples/naval_fate.go
+++ b/examples/naval_fate.go
@@ -1,12 +1,12 @@
 package main
 
 import (
-        "fmt"
-        docopt "github.com/kbatten/docopt.go"
+	"fmt"
+	docopt "github.com/kbatten/docopt.go"
 )
 
 func main() {
-usage := `Naval Fate.
+	usage := `Naval Fate.
 
 Usage:
   naval_fate.py ship new <name>...
@@ -23,6 +23,6 @@
   --moored      Moored (anchored) mine.
   --drifting    Drifting mine.`
 
-    arguments := docopt.ParseLoud(usage, nil, true, "Naval Fate 2.0", false)
-    fmt.Println(arguments)
+	arguments, _ := docopt.Parse(usage, nil, true, "Naval Fate 2.0", false)
+	fmt.Println(arguments)
 }
