public function process()
 {
     $prepare = $this->prepare();
     if ($prepare !== true) {
         return $prepare;
     }
     $this->setPaths();
     $this->builder = new GitPackageBuilder($this->modx, $this->smarty, $this->packagePath);
     $buildOptions = $this->config->getBuild();
     $objectAttributes = $buildOptions->getAttributes();
     foreach ($objectAttributes as $element => $attributes) {
         $this->builder->updateCategoryAttribute($element, $attributes);
     }
     $version = explode('-', $this->config->getVersion());
     if (count($version) == 1) {
         $version[1] = 'pl';
     }
     $this->builder->getTPBuilder()->directory = $this->config->getPackagePath() . '/_packages/';
     $this->builder->getTPBuilder()->createPackage($this->config->getLowCaseName(), $version[0], $version[1]);
     $this->builder->registerNamespace($this->config->getLowCaseName(), false, true, '{core_path}components/' . $this->config->getLowCaseName() . '/', '{assets_path}components/' . $this->config->getLowCaseName() . '/');
     $vehicle = $this->addCategory();
     $resolver = $buildOptions->getResolver();
     $resolversDir = $resolver->getResolversDir();
     $resolversDir = trim($resolversDir, '/');
     $resolversDir = $this->packagePath . '_build/' . $resolversDir . '/';
     $before = $resolver->getBefore();
     foreach ($before as $script) {
         $vehicle->addPHPResolver($resolversDir . ltrim($script, '/'));
     }
     if (is_dir($this->assetsPath)) {
         $vehicle->addAssetsResolver($this->assetsPath);
     }
     if (is_dir($this->corePath)) {
         $vehicle->addCoreResolver($this->corePath);
     }
     $fileResolvers = $resolver->getFileResolvers();
     foreach ($fileResolvers as $fileResolver) {
         $source = $fileResolver['source'];
         $source = str_replace('[[+corePath]]', $this->corePath, $source);
         $source = str_replace('[[+assetsPath]]', $this->assetsPath, $source);
         $source = str_replace('[[+packagePath]]', $this->packagePath, $source);
         $vehicle->addFileResolver($source, $fileResolver['target']);
     }
     $db = $this->config->getDatabase();
     if ($db != null) {
         $tables = $db->getTables();
         if (!empty($tables)) {
             $vehicle->addTableResolver($this->packagePath . '_build/gpm_resolvers', $tables);
         }
     }
     $extensionPackage = $this->config->getExtensionPackage();
     if ($extensionPackage !== false) {
         if ($extensionPackage === true) {
             $vehicle->addExtensionPackageResolver($this->packagePath . '_build/gpm_resolvers');
         } else {
             $vehicle->addExtensionPackageResolver($this->packagePath . '_build/gpm_resolvers', $extensionPackage['serviceName'], $extensionPackage['serviceClass']);
         }
     }
     if (!empty($this->tvMap)) {
         $vehicle->addTVResolver($this->packagePath . '_build/gpm_resolvers', $this->tvMap);
     }
     $resources = $this->config->getResources();
     $resourcesArray = array();
     foreach ($resources as $resource) {
         $resourcesArray[] = $resource->toRawArray();
     }
     if (!empty($resourcesArray)) {
         $vehicle->addResourceResolver($this->packagePath . '_build/gpm_resolvers', $resourcesArray);
     }
     $this->addWidgets();
     $this->addSystemSettings();
     $after = $resolver->getAfter();
     foreach ($after as $script) {
         $vehicle->addPHPResolver($resolversDir . ltrim($script, '/'));
     }
     $this->builder->putVehicle($vehicle);
     $this->addMenus();
     $packageAttributes = array();
     $license = ltrim($buildOptions->getLicense(), '/');
     if (!empty($license) && file_exists($this->corePath . $license)) {
         $packageAttributes['license'] = file_get_contents($this->corePath . $license);
     }
     $readme = ltrim($buildOptions->getReadme(), '/');
     if (!empty($readme) && file_exists($this->corePath . $readme)) {
         $packageAttributes['readme'] = file_get_contents($this->corePath . $readme);
     }
     $changeLog = ltrim($buildOptions->getChangeLog(), '/');
     if (!empty($changeLog) && file_exists($this->corePath . $changeLog)) {
         $packageAttributes['changelog'] = file_get_contents($this->corePath . $changeLog);
     }
     $setupOptions = $buildOptions->getSetupOptions();
     if (!empty($setupOptions) && isset($setupOptions['source']) && !empty($setupOptions['source'])) {
         $file = $this->packagePath . '_build/' . $setupOptions['source'];
         if (file_exists($file)) {
             $setupOptions['source'] = $file;
             $packageAttributes['setup-options'] = $setupOptions;
         }
     }
     $dependencies = $this->config->getDependencies();
     if (!empty($dependencies)) {
         $packageAttributes['requires'] = array();
         foreach ($dependencies as $dependency) {
             $packageAttributes['requires'][$dependency['name']] = $dependency['version'];
         }
     }
     $this->builder->setPackageAttributes($packageAttributes);
     $this->builder->pack();
     return $this->success();
 }