diff --git a/CHANGELOG.md b/CHANGELOG.md
index 916bca9..771bcd0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,11 @@
-## 0.12.3-dev
+## 0.12.2+2
 
 * Updated dependency constraint on `unittest`.
 
+* Formatted source code.
+
+* Fixed use of deprecated API in example.
+
 ## 0.12.2+1
 
 * Fix the built-in `help` command for `CommandRunner`.
diff --git a/example/test_runner.dart b/example/test_runner.dart
index fac1690..9480f41 100644
--- a/example/test_runner.dart
+++ b/example/test_runner.dart
@@ -14,92 +14,125 @@
 main() {
   var parser = new ArgParser();
 
-  parser.addOption('mode', abbr: 'm', defaultsTo: 'debug',
+  parser.addOption('mode',
+      abbr: 'm',
+      defaultsTo: 'debug',
       help: 'Mode in which to run the tests',
       allowed: ['all', 'debug', 'release']);
 
-  parser.addOption('compiler', abbr: 'c', defaultsTo: 'none',
+  parser.addOption('compiler',
+      abbr: 'c',
+      defaultsTo: 'none',
       help: 'Specify any compilation step (if needed).',
       allowed: ['none', 'dart2js', 'dartc'],
       allowedHelp: {
-        'none': 'Do not compile the Dart code (run native Dart code on the'
-          ' VM).\n(only valid with the following runtimes: vm, drt)',
-        'dart2js': 'Compile dart code to JavaScript by running dart2js.\n'
-          '(only valid with the following runtimes: d8, drt, chrome\n'
-          'safari, ie, firefox, opera, none (compile only))',
-        'dartc': 'Perform static analysis on Dart code by running dartc.\n'
-          '(only valid with the following runtimes: none)',
-      });
+    'none': 'Do not compile the Dart code (run native Dart code on the'
+        ' VM).\n(only valid with the following runtimes: vm, drt)',
+    'dart2js': 'Compile dart code to JavaScript by running dart2js.\n'
+        '(only valid with the following runtimes: d8, drt, chrome\n'
+        'safari, ie, firefox, opera, none (compile only))',
+    'dartc': 'Perform static analysis on Dart code by running dartc.\n'
+        '(only valid with the following runtimes: none)',
+  });
 
-  parser.addOption('runtime', abbr: 'r', defaultsTo: 'vm',
+  parser.addOption('runtime',
+      abbr: 'r',
+      defaultsTo: 'vm',
       help: 'Where the tests should be run.',
-      allowed: ['vm', 'd8', 'drt', 'dartium', 'ff', 'firefox', 'chrome',
-              'safari', 'ie', 'opera', 'none'],
+      allowed: [
+    'vm',
+    'd8',
+    'drt',
+    'dartium',
+    'ff',
+    'firefox',
+    'chrome',
+    'safari',
+    'ie',
+    'opera',
+    'none'
+  ],
       allowedHelp: {
-        'vm': 'Run Dart code on the standalone dart vm.',
-        'd8': 'Run JavaScript from the command line using v8.',
-        // TODO(antonm): rename flag.
-        'drt': 'Run Dart or JavaScript in the headless version of Chrome,\n'
-          'content shell.',
-        'dartium': 'Run Dart or JavaScript in Dartium.',
-        'ff': 'Run JavaScript in Firefox',
-        'chrome': 'Run JavaScript in Chrome',
-        'safari': 'Run JavaScript in Safari',
-        'ie': 'Run JavaScript in Internet Explorer',
-        'opera': 'Run JavaScript in Opera',
-        'none': 'No runtime, compile only (for example, used for dartc static\n'
-          'analysis tests).',
-      });
+    'vm': 'Run Dart code on the standalone dart vm.',
+    'd8': 'Run JavaScript from the command line using v8.',
+    // TODO(antonm): rename flag.
+    'drt': 'Run Dart or JavaScript in the headless version of Chrome,\n'
+        'content shell.',
+    'dartium': 'Run Dart or JavaScript in Dartium.',
+    'ff': 'Run JavaScript in Firefox',
+    'chrome': 'Run JavaScript in Chrome',
+    'safari': 'Run JavaScript in Safari',
+    'ie': 'Run JavaScript in Internet Explorer',
+    'opera': 'Run JavaScript in Opera',
+    'none': 'No runtime, compile only (for example, used for dartc static\n'
+        'analysis tests).',
+  });
 
-  parser.addOption('arch', abbr: 'a', defaultsTo: 'ia32',
+  parser.addOption('arch',
+      abbr: 'a',
+      defaultsTo: 'ia32',
       help: 'The architecture to run tests for',
       allowed: ['all', 'ia32', 'x64', 'simarm']);
 
-  parser.addOption('system', abbr: 's', defaultsTo: Platform.operatingSystem,
+  parser.addOption('system',
+      abbr: 's',
+      defaultsTo: Platform.operatingSystem,
       help: 'The operating system to run tests on',
       allowed: ['linux', 'macos', 'windows']);
 
-  parser.addFlag('checked', defaultsTo: false,
-      help: 'Run tests in checked mode');
+  parser.addFlag('checked',
+      defaultsTo: false, help: 'Run tests in checked mode');
 
-  parser.addFlag('host-checked', defaultsTo: false,
-      help: 'Run compiler in checked mode');
+  parser.addFlag('host-checked',
+      defaultsTo: false, help: 'Run compiler in checked mode');
 
-  parser.addOption('timeout', abbr: 't',
-      help: 'Timeout in seconds');
+  parser.addOption('timeout', abbr: 't', help: 'Timeout in seconds');
 
-  parser.addOption('progress', abbr: 'p', defaultsTo: 'compact',
+  parser.addOption('progress',
+      abbr: 'p',
+      defaultsTo: 'compact',
       help: 'Progress indication mode',
-      allowed: ['compact', 'color', 'line', 'verbose', 'silent', 'status',
-                'buildbot']);
+      allowed: [
+    'compact',
+    'color',
+    'line',
+    'verbose',
+    'silent',
+    'status',
+    'buildbot'
+  ]);
 
-  parser.addFlag('report', defaultsTo: false,
+  parser.addFlag('report',
+      defaultsTo: false,
       help: 'Print a summary report of the number of tests, by expectation');
 
-  parser.addOption('tasks', abbr: 'j',
+  parser.addOption('tasks',
+      abbr: 'j',
       defaultsTo: Platform.numberOfProcessors.toString(),
       help: 'The number of parallel tasks to run');
 
-  parser.addOption('shards', defaultsTo: '1',
+  parser.addOption('shards',
+      defaultsTo: '1',
       help: 'The number of instances that the tests will be sharded over');
 
-  parser.addOption('shard', defaultsTo: '1',
+  parser.addOption('shard',
+      defaultsTo: '1',
       help: 'The index of this instance when running in sharded mode');
 
-  parser.addFlag('verbose', abbr: 'v', defaultsTo: false,
-      help: 'Verbose output');
+  parser.addFlag('verbose',
+      abbr: 'v', defaultsTo: false, help: 'Verbose output');
 
-  parser.addFlag('list', defaultsTo: false,
-      help: 'List tests only, do not run them');
+  parser.addFlag('list',
+      defaultsTo: false, help: 'List tests only, do not run them');
 
-  parser.addFlag('keep-generated-tests', defaultsTo: false,
+  parser.addFlag('keep-generated-tests',
+      defaultsTo: false,
       help: 'Keep the generated files in the temporary directory');
 
-  parser.addFlag('valgrind', defaultsTo: false,
-      help: 'Run tests through valgrind');
+  parser.addFlag('valgrind',
+      defaultsTo: false, help: 'Run tests through valgrind');
 
-  parser.addOption('special-command',
-      help: """
+  parser.addOption('special-command', help: """
 Special command support. Wraps the command line in
 a special command. The special command should contain
 an '@' character which will be replaced by the normal
@@ -111,16 +144,14 @@
 'python -u valgrind.py dart file.dart suffix'""");
 
   parser.addFlag('time',
-      help: 'Print timing information after running tests',
-      defaultsTo: false);
+      help: 'Print timing information after running tests', defaultsTo: false);
 
-  parser.addOption('dart',    help: 'Path to dart executable');
-  parser.addOption('drt',     help: 'Path to content shell executable');
+  parser.addOption('dart', help: 'Path to dart executable');
+  parser.addOption('drt', help: 'Path to content shell executable');
   parser.addOption('dartium', help: 'Path to Dartium Chrome executable');
 
-  parser.addFlag('batch', abbr: 'b',
-      help: 'Run browser tests in batch mode',
-      defaultsTo: true);
+  parser.addFlag('batch',
+      abbr: 'b', help: 'Run browser tests in batch mode', defaultsTo: true);
 
-  print(parser.getUsage());
+  print(parser.usage);
 }
diff --git a/lib/command_runner.dart b/lib/command_runner.dart
index bbc19b2..d728cb0 100644
--- a/lib/command_runner.dart
+++ b/lib/command_runner.dart
@@ -61,8 +61,7 @@
   }
 
   /// An unmodifiable view of all top-level commands defined for this runner.
-  Map<String, Command> get commands =>
-      new UnmodifiableMapView(_commands);
+  Map<String, Command> get commands => new UnmodifiableMapView(_commands);
   final _commands = new Map<String, Command>();
 
   /// The top-level argument parser.
@@ -73,8 +72,8 @@
   final argParser = new ArgParser();
 
   CommandRunner(this.executableName, this.description) {
-    argParser.addFlag('help', abbr: 'h', negatable: false,
-        help: 'Print this usage information.');
+    argParser.addFlag('help',
+        abbr: 'h', negatable: false, help: 'Print this usage information.');
     addCommand(new HelpCommand());
   }
 
@@ -206,9 +205,9 @@
     parents.add(runner.executableName);
 
     var invocation = parents.reversed.join(" ");
-    return _subcommands.isNotEmpty ?
-        "$invocation <subcommand> [arguments]" :
-        "$invocation [arguments]";
+    return _subcommands.isNotEmpty
+        ? "$invocation <subcommand> [arguments]"
+        : "$invocation [arguments]";
   }
 
   /// The command's parent command, if this is a subcommand.
@@ -263,8 +262,8 @@
   /// Returns [usage] with [description] removed from the beginning.
   String get _usageWithoutDescription {
     var buffer = new StringBuffer()
-        ..writeln('Usage: $invocation')
-        ..writeln(argParser.usage);
+      ..writeln('Usage: $invocation')
+      ..writeln(argParser.usage);
 
     if (_subcommands.isNotEmpty) {
       buffer.writeln();
@@ -283,8 +282,7 @@
   }
 
   /// An unmodifiable view of all sublevel commands of this command.
-  Map<String, Command> get subcommands =>
-      new UnmodifiableMapView(_subcommands);
+  Map<String, Command> get subcommands => new UnmodifiableMapView(_subcommands);
   final _subcommands = new Map<String, Command>();
 
   /// Whether or not this command should be hidden from help listings.
@@ -321,8 +319,8 @@
   final aliases = const <String>[];
 
   Command() {
-    argParser.addFlag('help', abbr: 'h', negatable: false,
-        help: 'Print this usage information.');
+    argParser.addFlag('help',
+        abbr: 'h', negatable: false, help: 'Print this usage information.');
   }
 
   /// Runs this command.
@@ -361,8 +359,8 @@
 String _getCommandUsage(Map<String, Command> commands,
     {bool isSubcommand: false}) {
   // Don't include aliases.
-  var names = commands.keys
-      .where((name) => !commands[name].aliases.contains(name));
+  var names =
+      commands.keys.where((name) => !commands[name].aliases.contains(name));
 
   // Filter out hidden ones, unless they are all hidden.
   var visible = names.where((name) => !commands[name].hidden);
@@ -372,8 +370,8 @@
   names = names.toList()..sort();
   var length = names.map((name) => name.length).reduce(math.max);
 
-  var buffer = new StringBuffer(
-      'Available ${isSubcommand ? "sub" : ""}commands:');
+  var buffer =
+      new StringBuffer('Available ${isSubcommand ? "sub" : ""}commands:');
   for (var name in names) {
     buffer.writeln();
     buffer.write('  ${padRight(name, length)}   '
diff --git a/lib/src/arg_parser.dart b/lib/src/arg_parser.dart
index 03d8d3f..8337c42 100644
--- a/lib/src/arg_parser.dart
+++ b/lib/src/arg_parser.dart
@@ -33,18 +33,19 @@
   /// after it finds an argument that is neither an option nor a command.
   /// This allows options to be specified after regular arguments. Defaults to
   /// `false`.
-  factory ArgParser({bool allowTrailingOptions}) =>
-      new ArgParser._(<String, Option>{}, <String, ArgParser>{},
-          allowTrailingOptions: allowTrailingOptions);
+  factory ArgParser({bool allowTrailingOptions}) => new ArgParser._(
+      <String, Option>{}, <String, ArgParser>{},
+      allowTrailingOptions: allowTrailingOptions);
 
   ArgParser._(Map<String, Option> options, Map<String, ArgParser> commands,
-      {bool allowTrailingOptions}) :
-    this._options = options,
-    this.options = new UnmodifiableMapView(options),
-    this._commands = commands,
-    this.commands = new UnmodifiableMapView(commands),
-    this.allowTrailingOptions = allowTrailingOptions != null ?
-        allowTrailingOptions : false;
+      {bool allowTrailingOptions})
+      : this._options = options,
+        this.options = new UnmodifiableMapView(options),
+        this._commands = commands,
+        this.commands = new UnmodifiableMapView(commands),
+        this.allowTrailingOptions = allowTrailingOptions != null
+            ? allowTrailingOptions
+            : false;
 
   /// Defines a command.
   ///
@@ -86,8 +87,8 @@
 
   void _addOption(String name, String abbr, String help, String valueHelp,
       List<String> allowed, Map<String, String> allowedHelp, defaultsTo,
-      void callback(value), OptionType type, {bool negatable: false,
-      bool hide: false}) {
+      void callback(value), OptionType type,
+      {bool negatable: false, bool hide: false}) {
     // Make sure the name isn't in use.
     if (_options.containsKey(name)) {
       throw new ArgumentError('Duplicate option "$name".');
@@ -103,8 +104,8 @@
     }
 
     _options[name] = newOption(name, abbr, help, valueHelp, allowed,
-        allowedHelp, defaultsTo, callback, type, negatable: negatable,
-        hide: hide);
+        allowedHelp, defaultsTo, callback, type,
+        negatable: negatable, hide: hide);
   }
 
   /// Parses [args], a list of command-line arguments, matches them against the
diff --git a/lib/src/arg_results.dart b/lib/src/arg_results.dart
index 815d8dd..de9cca7 100644
--- a/lib/src/arg_results.dart
+++ b/lib/src/arg_results.dart
@@ -13,8 +13,8 @@
 /// Since [ArgResults] doesn't have a public constructor, this lets [Parser]
 /// get to it. This function isn't exported to the public API of the package.
 ArgResults newArgResults(ArgParser parser, Map<String, dynamic> parsed,
-      String name, ArgResults command, List<String> rest,
-      List<String> arguments) {
+    String name, ArgResults command, List<String> rest,
+    List<String> arguments) {
   return new ArgResults._(parser, parsed, name, command, rest, arguments);
 }
 
diff --git a/lib/src/option.dart b/lib/src/option.dart
index 6edc8ab..b2292db 100644
--- a/lib/src/option.dart
+++ b/lib/src/option.dart
@@ -43,12 +43,13 @@
 
   Option._(this.name, this.abbreviation, this.help, this.valueHelp,
       List<String> allowed, Map<String, String> allowedHelp, this.defaultValue,
-      this.callback, this.type, {this.negatable, this.hide: false}) :
-        this.allowed = allowed == null ?
-            null : new UnmodifiableListView(allowed),
-        this.allowedHelp = allowedHelp == null ?
-            null : new UnmodifiableMapView(allowedHelp) {
-
+      this.callback, this.type, {this.negatable, this.hide: false})
+      : this.allowed = allowed == null
+          ? null
+          : new UnmodifiableListView(allowed),
+        this.allowedHelp = allowedHelp == null
+            ? null
+            : new UnmodifiableMapView(allowedHelp) {
     if (name.isEmpty) {
       throw new ArgumentError('Name cannot be empty.');
     } else if (name.startsWith('-')) {
@@ -63,7 +64,7 @@
     if (abbreviation != null) {
       if (abbreviation.length != 1) {
         throw new ArgumentError('Abbreviation must be null or have length 1.');
-      } else if(abbreviation == '-') {
+      } else if (abbreviation == '-') {
         throw new ArgumentError('Abbreviation cannot be "-".');
       }
 
@@ -121,4 +122,4 @@
   final String name;
 
   const OptionType._(this.name);
-}
\ No newline at end of file
+}
diff --git a/lib/src/parser.dart b/lib/src/parser.dart
index 9cd141c..1e297b0 100644
--- a/lib/src/parser.dart
+++ b/lib/src/parser.dart
@@ -92,8 +92,8 @@
     // Add in the leftover arguments we didn't parse to the innermost command.
     rest.addAll(args);
     args.clear();
-    return newArgResults(grammar, results, commandName, commandResults, rest,
-        arguments);
+    return newArgResults(
+        grammar, results, commandName, commandResults, rest, arguments);
   }
 
   /// Pulls the value for [option] from the second argument in [args].
@@ -101,8 +101,7 @@
   /// Validates that there is a valid value there.
   void readNextArgAsValue(Option option) {
     // Take the option argument from the next command line arg.
-    validate(args.length > 0,
-        'Missing argument for "${option.name}".');
+    validate(args.length > 0, 'Missing argument for "${option.name}".');
 
     // Make sure it isn't an option itself.
     validate(!_ABBR_OPT.hasMatch(current) && !_LONG_OPT.hasMatch(current),
@@ -124,8 +123,8 @@
     var option = grammar.findByAbbreviation(soloOpt[1]);
     if (option == null) {
       // Walk up to the parent command if possible.
-      validate(parent != null,
-          'Could not find an option or flag "-${soloOpt[1]}".');
+      validate(
+          parent != null, 'Could not find an option or flag "-${soloOpt[1]}".');
       return parent.parseSoloOption();
     }
 
@@ -153,8 +152,8 @@
     var first = grammar.findByAbbreviation(c);
     if (first == null) {
       // Walk up to the parent command if possible.
-      validate(parent != null,
-          'Could not find an option with short name "-$c".');
+      validate(
+          parent != null, 'Could not find an option with short name "-$c".');
       return parent.parseAbbreviation(innermostCommand);
     } else if (!first.isFlag) {
       // The first character is a non-flag option, so the rest must be the
@@ -165,8 +164,8 @@
       // If we got some non-flag characters, then it must be a value, but
       // if we got here, it's a flag, which is wrong.
       validate(abbrOpt[2] == '',
-        'Option "-$c" is a flag and cannot handle value '
-        '"${abbrOpt[1].substring(1)}${abbrOpt[2]}".');
+          'Option "-$c" is a flag and cannot handle value '
+          '"${abbrOpt[1].substring(1)}${abbrOpt[2]}".');
 
       // Not an option, so all characters should be flags.
       // We use "innermostCommand" here so that if a parent command parses the
@@ -186,16 +185,16 @@
     var option = grammar.findByAbbreviation(c);
     if (option == null) {
       // Walk up to the parent command if possible.
-      validate(parent != null,
-          'Could not find an option with short name "-$c".');
+      validate(
+          parent != null, 'Could not find an option with short name "-$c".');
       parent.parseShortFlag(c);
       return;
     }
 
     // In a list of short options, only the first can be a non-flag. If
     // we get here we've checked that already.
-    validate(option.isFlag,
-        'Option "-$c" must be a flag to be in a collapsed "-".');
+    validate(
+        option.isFlag, 'Option "-$c" must be a flag to be in a collapsed "-".');
 
     setOption(results, option, true);
   }
diff --git a/pubspec.yaml b/pubspec.yaml
index deb8c15..c625ad0 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: args
-version: 0.12.3-dev
+version: 0.12.2+2
 author: "Dart Team <misc@dartlang.org>"
 homepage: https://github.com/dart-lang/args
 description: >
diff --git a/test/args_test.dart b/test/args_test.dart
index 77c23c3..dd1634d 100644
--- a/test/args_test.dart
+++ b/test/args_test.dart
@@ -29,7 +29,7 @@
     });
 
     test('throws ArgumentError if the abbreviation is longer '
-         'than one character', () {
+        'than one character', () {
       var parser = new ArgParser();
       throwsIllegalArg(() => parser.addFlag('flummox', abbr: 'flu'));
     });
@@ -37,7 +37,7 @@
     test('throws ArgumentError if a flag name is invalid', () {
       var parser = new ArgParser();
 
-      for(var name in _INVALID_OPTIONS) {
+      for (var name in _INVALID_OPTIONS) {
         var reason = '${Error.safeToString(name)} is not valid';
         throwsIllegalArg(() => parser.addFlag(name), reason: reason);
       }
@@ -46,7 +46,7 @@
     test('accepts valid flag names', () {
       var parser = new ArgParser();
 
-      for(var name in _VALID_OPTIONS) {
+      for (var name in _VALID_OPTIONS) {
         var reason = '${Error.safeToString(name)} is valid';
         expect(() => parser.addFlag(name), returnsNormally, reason: reason);
       }
@@ -73,7 +73,7 @@
     });
 
     test('throws ArgumentError if the abbreviation is longer '
-         'than one character', () {
+        'than one character', () {
       var parser = new ArgParser();
       throwsIllegalArg(() => parser.addOption('flummox', abbr: 'flu'));
     });
@@ -85,7 +85,7 @@
 
     test('throws ArgumentError if the abbreviation is an invalid value', () {
       var parser = new ArgParser();
-      for(var name in _INVALID_OPTIONS.where((v) => v != null)) {
+      for (var name in _INVALID_OPTIONS.where((v) => v != null)) {
         throwsIllegalArg(() => parser.addOption('flummox', abbr: name));
       }
     });
@@ -103,7 +103,7 @@
     test('throws ArgumentError if an option name is invalid', () {
       var parser = new ArgParser();
 
-      for(var name in _INVALID_OPTIONS) {
+      for (var name in _INVALID_OPTIONS) {
         var reason = '${Error.safeToString(name)} is not valid';
         throwsIllegalArg(() => parser.addOption(name), reason: reason);
       }
@@ -112,7 +112,7 @@
     test('accepts valid option names', () {
       var parser = new ArgParser();
 
-      for(var name in _VALID_OPTIONS) {
+      for (var name in _VALID_OPTIONS) {
         var reason = '${Error.safeToString(name)} is valid';
         expect(() => parser.addOption(name), returnsNormally, reason: reason);
       }
@@ -286,24 +286,28 @@
 }
 
 const _INVALID_OPTIONS = const [
- ' ', '', '-', '--', '--foo',
- ' with space',
- 'with\ttab',
- 'with\rcarriage\rreturn',
- 'with\nline\nfeed',
- "'singlequotes'",
- '"doublequotes"',
- 'back\\slash',
- 'forward/slash'
+  ' ',
+  '',
+  '-',
+  '--',
+  '--foo',
+  ' with space',
+  'with\ttab',
+  'with\rcarriage\rreturn',
+  'with\nline\nfeed',
+  "'singlequotes'",
+  '"doublequotes"',
+  'back\\slash',
+  'forward/slash'
 ];
 
 const _VALID_OPTIONS = const [
- 'a' // One character.
- 'contains-dash',
- 'contains_underscore',
- 'ends-with-dash-',
- 'contains--doubledash--',
- '1starts-with-number',
- 'contains-a-1number',
- 'ends-with-a-number8'
+  'a' // One character.
+      'contains-dash',
+  'contains_underscore',
+  'ends-with-dash-',
+  'contains--doubledash--',
+  '1starts-with-number',
+  'contains-a-1number',
+  'ends-with-a-number8'
 ];
diff --git a/test/command_parse_test.dart b/test/command_parse_test.dart
index ac53056..e336e71 100644
--- a/test/command_parse_test.dart
+++ b/test/command_parse_test.dart
@@ -34,8 +34,7 @@
 
   group('ArgParser.parse()', () {
     test('parses a command', () {
-      var parser = new ArgParser();
-      var command = parser.addCommand('install');
+      var parser = new ArgParser()..addCommand('install');
 
       var args = parser.parse(['install']);
 
@@ -53,9 +52,9 @@
     });
 
     test('parses a parent solo option before the command', () {
-      var parser = new ArgParser();
-      parser.addOption('mode', abbr: 'm');
-      var command = parser.addCommand('install');
+      var parser = new ArgParser()
+        ..addOption('mode', abbr: 'm')
+        ..addCommand('install');
 
       var args = parser.parse(['-m', 'debug', 'install']);
       expect(args['mode'], equals('debug'));
@@ -63,9 +62,9 @@
     });
 
     test('parses a parent solo option after the command', () {
-      var parser = new ArgParser();
-      parser.addOption('mode', abbr: 'm');
-      var command = parser.addCommand('install');
+      var parser = new ArgParser()
+        ..addOption('mode', abbr: 'm')
+        ..addCommand('install');
 
       var args = parser.parse(['install', '-m', 'debug']);
       expect(args['mode'], equals('debug'));
@@ -73,9 +72,9 @@
     });
 
     test('parses a parent option before the command', () {
-      var parser = new ArgParser();
-      parser.addFlag('verbose');
-      var command = parser.addCommand('install');
+      var parser = new ArgParser()
+        ..addFlag('verbose')
+        ..addCommand('install');
 
       var args = parser.parse(['--verbose', 'install']);
       expect(args['verbose'], isTrue);
@@ -83,9 +82,9 @@
     });
 
     test('parses a parent option after the command', () {
-      var parser = new ArgParser();
-      parser.addFlag('verbose');
-      var command = parser.addCommand('install');
+      var parser = new ArgParser()
+        ..addFlag('verbose')
+        ..addCommand('install');
 
       var args = parser.parse(['install', '--verbose']);
       expect(args['verbose'], isTrue);
@@ -93,9 +92,9 @@
     });
 
     test('parses a parent negated option before the command', () {
-      var parser = new ArgParser();
-      parser.addFlag('verbose', defaultsTo: true);
-      var command = parser.addCommand('install');
+      var parser = new ArgParser()
+        ..addFlag('verbose', defaultsTo: true)
+        ..addCommand('install');
 
       var args = parser.parse(['--no-verbose', 'install']);
       expect(args['verbose'], isFalse);
@@ -103,9 +102,9 @@
     });
 
     test('parses a parent negated option after the command', () {
-      var parser = new ArgParser();
-      parser.addFlag('verbose', defaultsTo: true);
-      var command = parser.addCommand('install');
+      var parser = new ArgParser()
+        ..addFlag('verbose', defaultsTo: true)
+        ..addCommand('install');
 
       var args = parser.parse(['install', '--no-verbose']);
       expect(args['verbose'], isFalse);
@@ -113,10 +112,10 @@
     });
 
     test('parses a parent abbreviation before the command', () {
-      var parser = new ArgParser();
-      parser.addFlag('debug', abbr: 'd');
-      parser.addFlag('verbose', abbr: 'v');
-      var command = parser.addCommand('install');
+      var parser = new ArgParser()
+        ..addFlag('debug', abbr: 'd')
+        ..addFlag('verbose', abbr: 'v')
+        ..addCommand('install');
 
       var args = parser.parse(['-dv', 'install']);
       expect(args['debug'], isTrue);
@@ -125,10 +124,10 @@
     });
 
     test('parses a parent abbreviation after the command', () {
-      var parser = new ArgParser();
-      parser.addFlag('debug', abbr: 'd');
-      parser.addFlag('verbose', abbr: 'v');
-      var command = parser.addCommand('install');
+      var parser = new ArgParser()
+        ..addFlag('debug', abbr: 'd')
+        ..addFlag('verbose', abbr: 'v')
+        ..addCommand('install');
 
       var args = parser.parse(['install', '-dv']);
       expect(args['debug'], isTrue);
@@ -180,9 +179,9 @@
     test('option is given to innermost command that can take it', () {
       var parser = new ArgParser();
       parser.addFlag('verbose');
-      var command = parser.addCommand('cmd');
-      command.addFlag('verbose');
-      var subcommand = command.addCommand('subcmd');
+      parser.addCommand('cmd')
+        ..addFlag('verbose')
+        ..addCommand('subcmd');
 
       var args = parser.parse(['cmd', 'subcmd', '--verbose']);
       expect(args['verbose'], isFalse);
@@ -193,8 +192,7 @@
 
     test('remaining arguments are given to the innermost command', () {
       var parser = new ArgParser();
-      var command = parser.addCommand('cmd');
-      var subcommand = command.addCommand('subcmd');
+      parser.addCommand('cmd')..addCommand('subcmd');
 
       var args = parser.parse(['cmd', 'subcmd', 'other', 'stuff']);
       expect(args.command.name, equals('cmd'));
diff --git a/test/command_runner_test.dart b/test/command_runner_test.dart
index ba7faeb..904a038 100644
--- a/test/command_runner_test.dart
+++ b/test/command_runner_test.dart
@@ -4,7 +4,6 @@
 
 library command_runner_test;
 
-import 'package:args/args.dart';
 import 'package:args/command_runner.dart';
 import 'package:unittest/unittest.dart';
 
@@ -28,8 +27,7 @@
   });
 
   test(".invocation has a sane default", () {
-    expect(runner.invocation,
-        equals("test <command> [arguments]"));
+    expect(runner.invocation, equals("test <command> [arguments]"));
   });
 
   group(".usage", () {
@@ -200,7 +198,7 @@
 
 Run "test help" to see global options.
 """));
-    });
+      });
 
       test("prints its own usage", () {
         expect(() => runner.run(["help", "help"]), prints("""
@@ -229,31 +227,28 @@
     });
 
     test("includes the footer in usage errors", () {
-      expect(runner.run(["--bad"]),
-          throwsUsageError('Could not find an option named "bad".',
-              "$_DEFAULT_USAGE\nAlso, footer!"));
+      expect(runner.run(["--bad"]), throwsUsageError(
+          'Could not find an option named "bad".',
+          "$_DEFAULT_USAGE\nAlso, footer!"));
     });
   });
 
   group("throws a useful error when", () {
     test("arg parsing fails", () {
-      expect(runner.run(["--bad"]),
-          throwsUsageError('Could not find an option named "bad".',
-              _DEFAULT_USAGE));
+      expect(runner.run(["--bad"]), throwsUsageError(
+          'Could not find an option named "bad".', _DEFAULT_USAGE));
     });
 
     test("a top-level command doesn't exist", () {
-      expect(runner.run(["bad"]),
-          throwsUsageError('Could not find a command named "bad".',
-              _DEFAULT_USAGE));
+      expect(runner.run(["bad"]), throwsUsageError(
+          'Could not find a command named "bad".', _DEFAULT_USAGE));
     });
 
     test("a subcommand doesn't exist", () {
-      runner.addCommand(
-          new FooCommand()..addSubcommand(new AsyncCommand()));
+      runner.addCommand(new FooCommand()..addSubcommand(new AsyncCommand()));
 
-      expect(runner.run(["foo bad"]),
-          throwsUsageError('Could not find a command named "foo bad".', """
+      expect(runner.run(["foo bad"]), throwsUsageError(
+          'Could not find a command named "foo bad".', """
 Usage: test <command> [arguments]
 
 Global options:
@@ -267,11 +262,10 @@
     });
 
     test("a subcommand wasn't passed", () {
-      runner.addCommand(
-          new FooCommand()..addSubcommand(new AsyncCommand()));
+      runner.addCommand(new FooCommand()..addSubcommand(new AsyncCommand()));
 
-      expect(runner.run(["foo"]),
-          throwsUsageError('Missing subcommand for "test foo".', """
+      expect(runner.run(["foo"]), throwsUsageError(
+          'Missing subcommand for "test foo".', """
 Usage: test foo <subcommand> [arguments]
 -h, --help    Print this usage information.
 
@@ -284,8 +278,8 @@
     test("a command that doesn't take arguments was given them", () {
       runner.addCommand(new FooCommand());
 
-      expect(runner.run(["foo", "bar"]),
-          throwsUsageError('Command "foo" does not take any arguments.', """
+      expect(runner.run(["foo", "bar"]), throwsUsageError(
+          'Command "foo" does not take any arguments.', """
 Usage: test foo [arguments]
 -h, --help    Print this usage information.
 
diff --git a/test/command_test.dart b/test/command_test.dart
index ae3594b..fe3446c 100644
--- a/test/command_test.dart
+++ b/test/command_test.dart
@@ -4,7 +4,6 @@
 
 library command_test;
 
-import 'package:args/args.dart';
 import 'package:args/command_runner.dart';
 import 'package:unittest/unittest.dart';
 import 'utils.dart';
@@ -14,28 +13,25 @@
   setUp(() {
     foo = new FooCommand();
 
-      // Make sure [Command.runner] is set up.
+    // Make sure [Command.runner] is set up.
     new CommandRunner("test", "A test command runner.").addCommand(foo);
   });
 
   group(".invocation has a sane default", () {
     test("without subcommands", () {
-      expect(foo.invocation,
-          equals("test foo [arguments]"));
+      expect(foo.invocation, equals("test foo [arguments]"));
     });
 
     test("with subcommands", () {
       foo.addSubcommand(new AsyncCommand());
-      expect(foo.invocation,
-          equals("test foo <subcommand> [arguments]"));
+      expect(foo.invocation, equals("test foo <subcommand> [arguments]"));
     });
 
     test("for a subcommand", () {
       var async = new AsyncCommand();
       foo.addSubcommand(async);
 
-      expect(async.invocation,
-          equals("test foo async [arguments]"));
+      expect(async.invocation, equals("test foo async [arguments]"));
     });
   });
 
diff --git a/test/parse_test.dart b/test/parse_test.dart
index 56320d6..0dd00ba 100644
--- a/test/parse_test.dart
+++ b/test/parse_test.dart
@@ -105,17 +105,16 @@
         var parser = new ArgParser();
         parser.addFlag('a', callback: (value) => a = value);
 
-        var args = parser.parse(['--a']);
+        parser.parse(['--a']);
         expect(a, isTrue);
       });
 
       test('for absent flags are invoked with the default value', () {
         var a;
         var parser = new ArgParser();
-        parser.addFlag('a', defaultsTo: false,
-            callback: (value) => a = value);
+        parser.addFlag('a', defaultsTo: false, callback: (value) => a = value);
 
-        var args = parser.parse([]);
+        parser.parse([]);
         expect(a, isFalse);
       });
 
@@ -124,7 +123,7 @@
         var parser = new ArgParser();
         parser.addFlag('a', callback: (value) => a = value);
 
-        var args = parser.parse([]);
+        parser.parse([]);
         expect(a, isFalse);
       });
 
@@ -133,17 +132,16 @@
         var parser = new ArgParser();
         parser.addOption('a', callback: (value) => a = value);
 
-        var args = parser.parse(['--a=v']);
+        parser.parse(['--a=v']);
         expect(a, equals('v'));
       });
 
       test('for absent options are invoked with the default value', () {
         var a;
         var parser = new ArgParser();
-        parser.addOption('a', defaultsTo: 'v',
-            callback: (value) => a = value);
+        parser.addOption('a', defaultsTo: 'v', callback: (value) => a = value);
 
-        var args = parser.parse([]);
+        parser.parse([]);
         expect(a, equals('v'));
       });
 
@@ -152,51 +150,53 @@
         var parser = new ArgParser();
         parser.addOption('a', callback: (value) => a = value);
 
-        var args = parser.parse([]);
+        parser.parse([]);
         expect(a, isNull);
       });
 
       test('for multiple present, allowMultiple, options are invoked with '
-           'value as a list', () {
+          'value as a list', () {
         var a;
         var parser = new ArgParser();
-        parser.addOption('a', allowMultiple: true,
-            callback: (value) => a = value);
+        parser.addOption('a',
+            allowMultiple: true, callback: (value) => a = value);
 
-        var args = parser.parse(['--a=v', '--a=x']);
+        parser.parse(['--a=v', '--a=x']);
         expect(a, equals(['v', 'x']));
       });
 
       test('for single present, allowMultiple, options are invoked with '
-           ' value as a single element list', () {
+          ' value as a single element list', () {
         var a;
         var parser = new ArgParser();
-        parser.addOption('a', allowMultiple: true,
-            callback: (value) => a = value);
+        parser.addOption('a',
+            allowMultiple: true, callback: (value) => a = value);
 
-        var args = parser.parse(['--a=v']);
+        parser.parse(['--a=v']);
         expect(a, equals(['v']));
       });
 
       test('for absent, allowMultiple, options are invoked with default '
-           'value as a list.', () {
+          'value as a list.', () {
         var a;
         var parser = new ArgParser();
-        parser.addOption('a', allowMultiple: true, defaultsTo: 'v',
+        parser.addOption('a',
+            allowMultiple: true,
+            defaultsTo: 'v',
             callback: (value) => a = value);
 
-        var args = parser.parse([]);
+        parser.parse([]);
         expect(a, equals(['v']));
       });
 
       test('for absent, allowMultiple, options are invoked with value '
-           'as an empty list.', () {
+          'as an empty list.', () {
         var a;
         var parser = new ArgParser();
-        parser.addOption('a', allowMultiple: true,
-            callback: (value) => a = value);
+        parser.addOption('a',
+            allowMultiple: true, callback: (value) => a = value);
 
-        var args = parser.parse([]);
+        parser.parse([]);
         expect(a, isEmpty);
       });
     });
@@ -392,11 +392,11 @@
         var args = parser.parse(['--define=1']);
         expect(args['define'], equals(['1']));
         args = parser.parse(['--define=1', '--define=2']);
-        expect(args['define'], equals(['1','2']));
+        expect(args['define'], equals(['1', '2']));
       });
 
       test('returns the default value for multi-valued arguments '
-           'if not explicitly set', () {
+          'if not explicitly set', () {
         var parser = new ArgParser();
         parser.addOption('define', defaultsTo: '0', allowMultiple: true);
         var args = parser.parse(['']);
diff --git a/test/trailing_options_test.dart b/test/trailing_options_test.dart
index 2ee860c..24f6ce7 100644
--- a/test/trailing_options_test.dart
+++ b/test/trailing_options_test.dart
@@ -19,9 +19,9 @@
       parser = new ArgParser(allowTrailingOptions: true);
     });
 
-    void expectThrows(List<String> args) =>
-      expect(() => parser.parse(args), throwsFormatException,
-          reason: "with allowTrailingOptions: true");
+    void expectThrows(List<String> args) => expect(
+        () => parser.parse(args), throwsFormatException,
+        reason: "with allowTrailingOptions: true");
 
     test('collects non-options in rest', () {
       parser.addFlag('flag');
@@ -84,8 +84,8 @@
   test("uses the innermost command's trailing options behavior", () {
     var parser = new ArgParser(allowTrailingOptions: true);
     parser.addFlag('flag', abbr: 'f');
-    var command = parser.addCommand('cmd',
-        new ArgParser(allowTrailingOptions: false));
+    var command =
+        parser.addCommand('cmd', new ArgParser(allowTrailingOptions: false));
     command.addFlag('verbose', abbr: 'v');
 
     var results = parser.parse(['a', '-f', 'b']);
diff --git a/test/usage_test.dart b/test/usage_test.dart
index 2c44ec3..e7f3e47 100644
--- a/test/usage_test.dart
+++ b/test/usage_test.dart
@@ -13,8 +13,7 @@
       var parser = new ArgParser();
       parser.addFlag('mode', help: 'The mode');
 
-      validateUsage(parser,
-          '''
+      validateUsage(parser, '''
           --[no-]mode    The mode
           ''');
     });
@@ -23,8 +22,7 @@
       var parser = new ArgParser();
       parser.addFlag('mode', negatable: false, help: 'The mode');
 
-      validateUsage(parser,
-          '''
+      validateUsage(parser, '''
           --mode    The mode
           ''');
     });
@@ -33,8 +31,7 @@
       var parser = new ArgParser();
       parser.addFlag('mode', help: 'The mode');
 
-      validateUsage(parser,
-          '''
+      validateUsage(parser, '''
           --[no-]mode    The mode
           ''');
     });
@@ -44,8 +41,7 @@
       parser.addFlag('mode', abbr: 'm', help: 'The mode');
       parser.addOption('long', help: 'Lacks an abbreviation');
 
-      validateUsage(parser,
-          '''
+      validateUsage(parser, '''
           -m, --[no-]mode    The mode
               --long         Lacks an abbreviation
           ''');
@@ -56,8 +52,7 @@
       parser.addFlag('mode', abbr: 'm', help: 'Lined up with below');
       parser.addOption('a-really-long-name', help: 'Its help text');
 
-      validateUsage(parser,
-          '''
+      validateUsage(parser, '''
           -m, --[no-]mode             Lined up with below
               --a-really-long-name    Its help text
           ''');
@@ -67,8 +62,7 @@
       var parser = new ArgParser();
       parser.addFlag('mode', help: '\n\n\n\nAfter newlines');
 
-      validateUsage(parser,
-          '''
+      validateUsage(parser, '''
           --[no-]mode    After newlines
           ''');
     });
@@ -77,8 +71,7 @@
       var parser = new ArgParser();
       parser.addFlag('mode', help: 'Before newlines\n\n\n\n');
 
-      validateUsage(parser,
-          '''
+      validateUsage(parser, '''
           --[no-]mode    Before newlines
           ''');
     });
@@ -89,8 +82,7 @@
       parser.addFlag('monkey', help: 'Second');
       parser.addFlag('wombat', help: 'Third');
 
-      validateUsage(parser,
-          '''
+      validateUsage(parser, '''
           --[no-]zebra     First
           --[no-]monkey    Second
           --[no-]wombat    Third
@@ -102,8 +94,7 @@
       parser.addFlag('affirm', help: 'Should be on', defaultsTo: true);
       parser.addFlag('negate', help: 'Should be off', defaultsTo: false);
 
-      validateUsage(parser,
-          '''
+      validateUsage(parser, '''
           --[no-]affirm    Should be on
                            (defaults to on)
 
@@ -115,8 +106,7 @@
       var parser = new ArgParser();
       parser.addOption('any', help: 'Can be anything', defaultsTo: 'whatevs');
 
-      validateUsage(parser,
-          '''
+      validateUsage(parser, '''
           --any    Can be anything
                    (defaults to "whatevs")
           ''');
@@ -124,22 +114,21 @@
 
     test('the value help is shown', () {
       var parser = new ArgParser();
-      parser.addOption('out', abbr: 'o', help: 'Where to write file',
-          valueHelp: 'path');
+      parser.addOption('out',
+          abbr: 'o', help: 'Where to write file', valueHelp: 'path');
 
-      validateUsage(parser,
-          '''
+      validateUsage(parser, '''
           -o, --out=<path>    Where to write file
           ''');
     });
 
     test('the allowed list is shown', () {
       var parser = new ArgParser();
-      parser.addOption('suit', help: 'Like in cards',
+      parser.addOption('suit',
+          help: 'Like in cards',
           allowed: ['spades', 'clubs', 'hearts', 'diamonds']);
 
-      validateUsage(parser,
-          '''
+      validateUsage(parser, '''
           --suit    Like in cards
                     [spades, clubs, hearts, diamonds]
           ''');
@@ -147,11 +136,12 @@
 
     test('the default is highlighted in the allowed list', () {
       var parser = new ArgParser();
-      parser.addOption('suit', help: 'Like in cards', defaultsTo: 'clubs',
+      parser.addOption('suit',
+          help: 'Like in cards',
+          defaultsTo: 'clubs',
           allowed: ['spades', 'clubs', 'hearts', 'diamonds']);
 
-      validateUsage(parser,
-          '''
+      validateUsage(parser, '''
           --suit    Like in cards
                     [spades, clubs (default), hearts, diamonds]
           ''');
@@ -159,17 +149,18 @@
 
     test('the allowed help is shown', () {
       var parser = new ArgParser();
-      parser.addOption('suit', help: 'Like in cards', defaultsTo: 'clubs',
+      parser.addOption('suit',
+          help: 'Like in cards',
+          defaultsTo: 'clubs',
           allowed: ['spades', 'clubs', 'diamonds', 'hearts'],
           allowedHelp: {
-            'spades': 'Swords of a soldier',
-            'clubs': 'Weapons of war',
-            'diamonds': 'Money for this art',
-            'hearts': 'The shape of my heart'
-          });
+        'spades': 'Swords of a soldier',
+        'clubs': 'Weapons of war',
+        'diamonds': 'Money for this art',
+        'hearts': 'The shape of my heart'
+      });
 
-      validateUsage(parser,
-          '''
+      validateUsage(parser, '''
           --suit              Like in cards
 
                 [clubs]       Weapons of war
@@ -185,9 +176,7 @@
       parser.addOption('second', hide: true);
       parser.addOption('third', help: 'The third option');
 
-
-      validateUsage(parser,
-          '''
+      validateUsage(parser, '''
           --first    The first option
           --third    The third option
           ''');
@@ -199,9 +188,7 @@
       parser.addFlag('second', hide: true);
       parser.addFlag('third', help: 'The third flag');
 
-
-      validateUsage(parser,
-          '''
+      validateUsage(parser, '''
           --[no-]first    The first flag
           --[no-]third    The third flag
           ''');
@@ -213,9 +200,7 @@
       parser.addFlag('second-very-long-option', hide: true);
       parser.addFlag('third', help: 'The third flag');
 
-
-      validateUsage(parser,
-          '''
+      validateUsage(parser, '''
           --[no-]first    The first flag
           --[no-]third    The third flag
           ''');
