diff --git a/lib/pool.dart b/lib/pool.dart
index d81386f..86f8363 100644
--- a/lib/pool.dart
+++ b/lib/pool.dart
@@ -78,8 +78,7 @@
   /// If [timeout] is passed, then if that much time passes without any activity
   /// all pending [request] futures will throw a [TimeoutException]. This is
   /// intended to avoid deadlocks.
-  Pool(this._maxAllocatedResources, {Duration timeout})
-      : _timeout = timeout {
+  Pool(this._maxAllocatedResources, {Duration timeout}) : _timeout = timeout {
     if (timeout != null) {
       // Start the timer canceled since we only want to start counting down once
       // we've run out of available resources.
@@ -140,21 +139,21 @@
   ///
   /// This may be called more than once; it returns the same [Future] each time.
   Future close() => _closeMemo.runOnce(() {
-    if (_closeGroup != null) return _closeGroup.future;
+        if (_closeGroup != null) return _closeGroup.future;
 
-    _resetTimer();
+        _resetTimer();
 
-    _closeGroup = new FutureGroup();
-    for (var callback in _onReleaseCallbacks) {
-      _closeGroup.add(new Future.sync(callback));
-    }
+        _closeGroup = new FutureGroup();
+        for (var callback in _onReleaseCallbacks) {
+          _closeGroup.add(new Future.sync(callback));
+        }
 
-    _allocatedResources -= _onReleaseCallbacks.length;
-    _onReleaseCallbacks.clear();
+        _allocatedResources -= _onReleaseCallbacks.length;
+        _onReleaseCallbacks.clear();
 
-    if (_allocatedResources == 0) _closeGroup.close();
-    return _closeGroup.future;
-  });
+        if (_allocatedResources == 0) _closeGroup.close();
+        return _closeGroup.future;
+      });
   final _closeMemo = new AsyncMemoizer();
 
   /// If there are any pending requests, this will fire the oldest one.
@@ -222,7 +221,8 @@
   void _onTimeout() {
     for (var completer in _requestedResources) {
       completer.completeError(
-          new TimeoutException("Pool deadlock: all resources have been "
+          new TimeoutException(
+              "Pool deadlock: all resources have been "
               "allocated for too long.",
               _timeout),
           new Chain.current());
diff --git a/test/pool_test.dart b/test/pool_test.dart
index 7fba9c0..6feba75 100644
--- a/test/pool_test.dart
+++ b/test/pool_test.dart
@@ -299,9 +299,11 @@
     test("pending requests are fulfilled", () async {
       var pool = new Pool(1);
       var resource1 = await pool.request();
-      expect(pool.request().then((resource2) {
-        resource2.release();
-      }), completes);
+      expect(
+          pool.request().then((resource2) {
+            resource2.release();
+          }),
+          completes);
       expect(pool.done, completes);
       expect(pool.close(), completes);
       resource1.release();
@@ -312,10 +314,12 @@
       var resource1 = await pool.request();
 
       var completer = new Completer();
-      expect(pool.request().then((resource2) {
-        expect(completer.isCompleted, isTrue);
-        resource2.release();
-      }), completes);
+      expect(
+          pool.request().then((resource2) {
+            expect(completer.isCompleted, isTrue);
+            resource2.release();
+          }),
+          completes);
       expect(pool.close(), completes);
 
       resource1.allowRelease(() => completer.future);
@@ -333,11 +337,13 @@
       var resource1Released = false;
       var resource2Released = false;
       var resource3Released = false;
-      expect(pool.close().then((_) {
-        expect(resource1Released, isTrue);
-        expect(resource2Released, isTrue);
-        expect(resource3Released, isTrue);
-      }), completes);
+      expect(
+          pool.close().then((_) {
+            expect(resource1Released, isTrue);
+            expect(resource2Released, isTrue);
+            expect(resource3Released, isTrue);
+          }),
+          completes);
 
       resource1Released = true;
       resource1.release();
@@ -360,9 +366,11 @@
       // [completer].
       var completer = new Completer();
       resource.allowRelease(() => completer.future);
-      expect(pool.request().then((_) {
-        expect(completer.isCompleted, isTrue);
-      }), completes);
+      expect(
+          pool.request().then((_) {
+            expect(completer.isCompleted, isTrue);
+          }),
+          completes);
 
       await new Future.delayed(Duration.ZERO);
       pool.close();
@@ -381,10 +389,12 @@
       var completer2 = new Completer();
       resource2.allowRelease(() => completer2.future);
 
-      expect(pool.close().then((_) {
-        expect(completer1.isCompleted, isTrue);
-        expect(completer2.isCompleted, isTrue);
-      }), completes);
+      expect(
+          pool.close().then((_) {
+            expect(completer1.isCompleted, isTrue);
+            expect(completer2.isCompleted, isTrue);
+          }),
+          completes);
 
       await new Future.delayed(Duration.ZERO);
       completer1.complete();
@@ -398,9 +408,11 @@
       var resource = await pool.request();
 
       var completer = new Completer();
-      expect(pool.close().then((_) {
-        expect(completer.isCompleted, isTrue);
-      }), completes);
+      expect(
+          pool.close().then((_) {
+            expect(completer.isCompleted, isTrue);
+          }),
+          completes);
 
       await new Future.delayed(Duration.ZERO);
       resource.allowRelease(() => completer.future);
@@ -438,10 +450,10 @@
 ///
 /// This should only be called within a [FakeAsync.run] zone.
 Matcher get doesNotComplete => predicate((future) {
-  expect(future, new isInstanceOf<Future>());
+      expect(future, new isInstanceOf<Future>());
 
-  var stack = new Trace.current(1);
-  future.then((_) => registerException(
-      new TestFailure("Expected future not to complete."), stack));
-  return true;
-});
+      var stack = new Trace.current(1);
+      future.then((_) => registerException(
+          new TestFailure("Expected future not to complete."), stack));
+      return true;
+    });
