/**
  * @param ScaffolderConfig $config
  */
 public function perform(ScaffolderConfig $config)
 {
     /**
      * @var RequestDeclaration $declaration
      */
     $declaration = $this->createDeclaration(['parent' => RequestFilter::class]);
     $declaration->setMapping($config->getMapping(static::ELEMENT));
     foreach ($this->option('field') as $field) {
         list($field, $type, $source, $origin) = $this->parseField($field);
         $declaration->declareField($field, $type, $source, $origin);
     }
     $this->writeDeclaration($declaration->normalize());
 }
 /**
  * @param ClassDeclaration $declaration
  */
 protected function writeDeclaration(ClassDeclaration $declaration)
 {
     $filename = $this->config->elementFilename(static::ELEMENT, $this->argument('name'));
     $filename = $this->files->normalizePath($filename);
     if ($this->files->exists($filename)) {
         $this->writeln("<fg=red>Unable to write '<comment>{$declaration->getName()}</comment>' declaration, " . "file '<comment>{$filename}</comment>' already exists.</fg=red>");
         return;
     }
     $file = new FileDeclaration($this->elementNamespace(), $this->config->headerLines());
     $file->addElement($declaration);
     $this->files->write($filename, $file->render(), FilesInterface::READONLY, true);
     $this->writeln("Declaration of '<info>{$declaration->getName()}</info>' " . "has been successfully written into '<comment>{$filename}</comment>'.");
 }