original_string: public function attach(EventDispatcher $eventDispatcher)
      {
          if (file_exists($this->databaseDirectory)) {
              throw new \RuntimeException(
                  sprintf('Database directory: "%s" already exists', $this->databaseDirectory)
              );
          }
  
          mkdir($this->databaseDirectory, 0777, true);
  
          try {
              $db = new PDO($this->userDsn);
              $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
          } catch (\PDOException $e) {
              rmdir($this->databaseDirectory);
              throw $e;
          }
  
          $eventDispatcher->listen('verify.start', function (Event $e) use ($db) {
              $e->getParameter('exercise')->seed($db);
              //make a copy - so solution can modify without effecting database user has access to
              copy($this->userDatabasePath, $this->solutionDatabasePath);
          });
  
          $eventDispatcher->listen('run.start', function (Event $e) use ($db) {
              $e->getParameter('exercise')->seed($db);
          });
  
          $eventDispatcher->listen('cli.verify.reference-execute.pre', function (CliExecuteEvent $e) {
              $e->prependArg($this->solutionDsn);
          });
  
          $eventDispatcher->listen(
              ['cli.verify.student-execute.pre', 'cli.run.student-execute.pre'],
              function (CliExecuteEvent $e) {
                  $e->prependArg($this->userDsn);
              }
          );
  
          $eventDispatcher->insertVerifier('verify.finish', function (Event $e) use ($db) {
              $verifyResult = $e->getParameter('exercise')->verify($db);
  
              if (false === $verifyResult) {
                  return Failure::fromNameAndReason($this->getName(), 'Database verification failed');
              }
  
              return new Success('Database Verification Check');
          });
  
          $eventDispatcher->listen(
              [
                  'cli.verify.reference-execute.fail',
                  'verify.finish',
                  'run.finish'
              ],
              function (Event $e) use ($db) {
                  unset($db);
                  @unlink($this->userDatabasePath);
                  @unlink($this->solutionDatabasePath);
                  rmdir($this->databaseDirectory);
              }
          );
      }
code: public function attach(EventDispatcher $eventDispatcher)
      {
          if (file_exists($this->databaseDirectory)) {
              throw new \RuntimeException(
                  sprintf('Database directory: "%s" already exists', $this->databaseDirectory)
              );
          }
  
          mkdir($this->databaseDirectory, 0777, true);
  
          try {
              $db = new PDO($this->userDsn);
              $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
          } catch (\PDOException $e) {
              rmdir($this->databaseDirectory);
              throw $e;
          }
  
          $eventDispatcher->listen('verify.start', function (Event $e) use ($db) {
              $e->getParameter('exercise')->seed($db);
              //make a copy - so solution can modify without effecting database user has access to
              copy($this->userDatabasePath, $this->solutionDatabasePath);
          });
  
          $eventDispatcher->listen('run.start', function (Event $e) use ($db) {
              $e->getParameter('exercise')->seed($db);
          });
  
          $eventDispatcher->listen('cli.verify.reference-execute.pre', function (CliExecuteEvent $e) {
              $e->prependArg($this->solutionDsn);
          });
  
          $eventDispatcher->listen(
              ['cli.verify.student-execute.pre', 'cli.run.student-execute.pre'],
              function (CliExecuteEvent $e) {
                  $e->prependArg($this->userDsn);
              }
          );
  
          $eventDispatcher->insertVerifier('verify.finish', function (Event $e) use ($db) {
              $verifyResult = $e->getParameter('exercise')->verify($db);
  
              if (false === $verifyResult) {
                  return Failure::fromNameAndReason($this->getName(), 'Database verification failed');
              }
  
              return new Success('Database Verification Check');
          });
  
          $eventDispatcher->listen(
              [
                  'cli.verify.reference-execute.fail',
                  'verify.finish',
                  'run.finish'
              ],
              function (Event $e) use ($db) {
                  unset($db);
                  @unlink($this->userDatabasePath);
                  @unlink($this->solutionDatabasePath);
                  rmdir($this->databaseDirectory);
              }
          );
      }
code_tokens: public function attach ( EventDispatcher $ eventDispatcher ) { if ( file_exists ( $ this -> databaseDirectory ) ) { throw new \ RuntimeException ( sprintf ( 'Database directory: "%s" already exists' , $ this -> databaseDirectory ) ) ; } mkdir ( $ this -> databaseDirectory , 0777 , true ) ; try { $ db = new PDO ( $ this -> userDsn ) ; $ db -> setAttribute ( PDO :: ATTR_ERRMODE , PDO :: ERRMODE_EXCEPTION ) ; } catch ( \ PDOException $ e ) { rmdir ( $ this -> databaseDirectory ) ; throw $ e ; } $ eventDispatcher -> listen ( 'verify.start' , function ( Event $ e ) use ( $ db ) { $ e -> getParameter ( 'exercise' ) -> seed ( $ db ) ; //make a copy - so solution can modify without effecting database user has access to copy ( $ this -> userDatabasePath , $ this -> solutionDatabasePath ) ; } ) ; $ eventDispatcher -> listen ( 'run.start' , function ( Event $ e ) use ( $ db ) { $ e -> getParameter ( 'exercise' ) -> seed ( $ db ) ; } ) ; $ eventDispatcher -> listen ( 'cli.verify.reference-execute.pre' , function ( CliExecuteEvent $ e ) { $ e -> prependArg ( $ this -> solutionDsn ) ; } ) ; $ eventDispatcher -> listen ( [ 'cli.verify.student-execute.pre' , 'cli.run.student-execute.pre' ] , function ( CliExecuteEvent $ e ) { $ e -> prependArg ( $ this -> userDsn ) ; } ) ; $ eventDispatcher -> insertVerifier ( 'verify.finish' , function ( Event $ e ) use ( $ db ) { $ verifyResult = $ e -> getParameter ( 'exercise' ) -> verify ( $ db ) ; if ( false === $ verifyResult ) { return Failure :: fromNameAndReason ( $ this -> getName ( ) , 'Database verification failed' ) ; } return new Success ( 'Database Verification Check' ) ; } ) ; $ eventDispatcher -> listen ( [ 'cli.verify.reference-execute.fail' , 'verify.finish' , 'run.finish' ] , function ( Event $ e ) use ( $ db ) { unset ( $ db ) ; @ unlink ( $ this -> userDatabasePath ) ; @ unlink ( $ this -> solutionDatabasePath ) ; rmdir ( $ this -> databaseDirectory ) ; } ) ; }
docstring: Here we attach to various events to seed, verify and inject the DSN's
  to the student & reference solution programs's CLI arguments.
  
  @param EventDispatcher $eventDispatcher
docstring_tokens: Here we attach to various events to seed verify and inject the DSN s to the student & reference solution programs s CLI arguments .