public function down()
    {
        $transaction = $this->db->createTransaction();
        return $transaction->begin()->thenLazy(
            function($connection) {
                $promise = $this->safeDown($connection);
                return is_array($promise) ? allInOrder($promise) : $promise;
            }
        )->thenLazy(
            function() use ($transaction) {
                return $transaction->commit();
            },
            function($error) use ($transaction) {
                $this->printException($error);
                return $transaction->rollBack()->then(
                    function() use ($error) { throw $error; },
                    function($e) { throw $e; }
                );
            }
        );
    }