Returns an array of resources loaded to build this configuration.
public getResources ( ) : Symfony\Component\Config\Resource\ResourceInterface[] | ||
Результат | Symfony\Component\Config\Resource\ResourceInterface[] | An array of resources |
/** * Builds the container. * @param array $parameters */ public function build($parameters = array()) { // sort array by key to generate the container name ksort($parameters); // needed for new packages installed $composerClass = array_filter(get_declared_classes(), function ($item) { if (0 === strpos($item, 'ComposerAutoloaderInit')) { return true; } }); $composerClass = array_pop($composerClass); // generate hash $parametersHash = md5(serialize($parameters) . $composerClass); $containerClass = 'Container' . $parametersHash; $isDebug = true; $file = sprintf('%s/ladybug_cache/%s.php', sys_get_temp_dir(), $parametersHash); $containerConfigCache = new ConfigCache($file, $isDebug); if (!$containerConfigCache->isFresh()) { $this->initializeContainer(); $this->loadServices(); $this->loadThemes(); $this->loadPlugins(); $this->setParameters($parameters); $this->container->compile(); $dumper = new PhpDumper($this->container); $containerConfigCache->write($dumper->dump(array('class' => $containerClass)), $this->container->getResources()); } else { require_once $file; $this->container = new $containerClass(); } }
/** * @param DnaConfiguration $dna * * @return \Nucleus\IService\DependencyInjection\IServiceContainer */ protected function loadServiceContainer($dna) { $cachePath = $dna->freezeCachePath()->getCachePath(); $class = 'ServiceContainer' . md5($cachePath); $file = $cachePath . '/serviceContainer/' . $class . '.php'; $containerConfigCache = new ConfigCache($file, $dna->getDebug()); $isNew = false; if (!class_exists($class)) { if (!$containerConfigCache->isFresh()) { $container = new ContainerBuilder(); $nucleusCompilerPass = new NucleusCompilerPass($dna); $container->addCompilerPass($nucleusCompilerPass); $container->compile(); $dumper = new PhpDumper($container); $containerConfigCache->write($dumper->dump(array('class' => $class, 'nucleus' => $nucleusCompilerPass->getConfiguration())), $container->getResources()); $isNew = true; } require $file; } $serviceContainer = new $class(); /* @var $serviceContainer \Nucleus\DependencyInjection\BaseServiceContainer */ $serviceContainer->initialize(); if ($isNew) { $serviceContainer->getServiceByName(IEventDispatcherService::NUCLEUS_SERVICE_NAME)->dispatch('ServiceContainer.postDump', $serviceContainer, array('containerBuilder' => $container, 'dnaConfiguration' => $dna)); } return $serviceContainer; }
/** * Dumps the service container to PHP code in the cache. * * @param ConfigCache $cache The config cache * @param ContainerBuilder $container The service container * @param string $class The name of the class to generate * @param string $baseClass The name of the container's base class */ protected function dumpContainer(ConfigCache $cache, ContainerBuilder $container, $class, $baseClass) { // cache the container $dumper = new PhpDumper($container); $content = $dumper->dump(array('class' => $class, 'base_class' => $baseClass, 'optimize_strings' => false)); $cache->write($content, $container->getResources()); }
/** * @param ContainerBuilder $container */ public function process(ContainerBuilder $container) { if ($container->hasDefinition('doctrine_mongodb.odm.listeners.resolve_target_document')) { $resourcePath = '.'; foreach ($container->getResources() as $resource) { if (!$resource instanceof FileResource) { continue; } $resourcePath = (string) $resource; if (is_string($resourcePath)) { if (strpos($resourcePath, 'BaseApiMongoModelBundle') && strpos($resourcePath, 'config') && strpos($resourcePath, 'yml') === false && strpos($resourcePath, 'validation') === false) { break; } } } $defaultResolveDocument = Yaml::parse(file_get_contents($resourcePath . '/resolve_document.yml'))['resolve_target_documents']; $definition = $container->findDefinition('doctrine_mongodb.odm.listeners.resolve_target_document'); $definitionCalls = $definition->getMethodCalls(); foreach ($defaultResolveDocument as $interface => $class) { if (!$this->resolverExist($definitionCalls, $interface)) { $definition->addMethodCall('addResolveTargetDocument', array($interface, $class, array())); } } } }
/** * Dumps the service container to PHP code in the cache * * @param \Symfony\Component\Config\ConfigCache $cache */ protected function dumpContainer(ConfigCache $cache) { $dumper = new PhpDumper($this->innerContainer); if (class_exists('ProxyManager\\Configuration')) { $dumper->setProxyDumper(new ProxyDumper()); } $content = $dumper->dump(array('class' => $this->containerClassName, 'base_class' => "Container")); $cache->write($content, $this->innerContainer->getResources()); }
public function testAddResource() { $containerBuilder = new ContainerBuilder(); $configBuilder = new PoliciesConfigBuilder($containerBuilder); $resource1 = new FileResource(__FILE__); $resource2 = new DirectoryResource(__DIR__); $configBuilder->addResource($resource1); $configBuilder->addResource($resource2); self::assertSame([$resource1, $resource2], $containerBuilder->getResources()); }
/** * Dump the container to the disk. * * @param ConfigCache $cache The config cache */ protected function dump_container($cache) { try { $dumper = new PhpDumper($this->container); $cached_container_dump = $dumper->dump(array('class' => 'phpbb_cache_container', 'base_class' => 'Symfony\\Component\\DependencyInjection\\ContainerBuilder')); $cache->write($cached_container_dump, $this->container->getResources()); } catch (IOException $e) { // Don't fail if the cache isn't writeable } }
protected function dumpContainer(ConfigCache $cache, ContainerBuilder $container, $class, $baseClass) { $dumper = new PhpDumper($container); $namespace = null; if (($p = strrpos($class, "\\")) !== false) { $namespace = substr($class, 0, $p); $class = substr($class, $p + 1); } $content = $dumper->dump(["namespace" => $namespace, "class" => $class, "base_class" => $baseClass]); $cache->write($content, $container->getResources()); }
/** * Modifica el atributo $direccionBundle de esta clase con la dirección del Bundle actual en que se instancia el objeto. * * @param $container * @param string $dir Dirección hasta DedendencyInjection del bundle a obtener la dirección. */ private function getDirBundle(ContainerBuilder $container, $dir) { $resources = $container->getResources(); foreach ($resources as $resource) { if (strpos($resource, $dir) !== false) { $this->direccionBundle = substr($dir, 0, strlen($dir) - 20); $arrayDirBundleSplited = explode(DIRECTORY_SEPARATOR, $this->direccionBundle); $this->nameBundle = $arrayDirBundleSplited[count($arrayDirBundleSplited) - 1]; break; } } }
public function testConfigFreshness() { touch(__FILE__, time() - 3600); $cache = new ConfigCache(static::$cacheDir . DIRECTORY_SEPARATOR . 'cache', TRUE); $container = new ContainerBuilder(); $locator = new FileLocator(__DIR__); $loader = new YamlArrayLoader($container, $locator); $loader->load(__FILE__, NULL, array('parameters' => array('x' => 'y'))); $container->compile(); $dumper = new PhpDumper($container); $cache->write($dumper->dump(), $container->getResources()); $this->assertTrue($cache->isFresh()); touch(__FILE__, time() + 5); $this->assertFalse($cache->isFresh()); $this->assertEquals($container->getParameter('x'), 'y'); }
/** * @test native serializer configuration */ public function nativeSerializers() { $this->loadExtension(['serializers' => ['default' => ['native' => []]]], false); $id = EventBandExtension::getSerializerId('default'); $this->assertTrue($this->container->hasDefinition($id)); $this->container->getDefinition($id)->setPublic(true); $this->container->compile(); $serializer = $this->container->get($id); $this->assertInstanceOf('EventBand\\Serializer\\NativeEventSerializer', $serializer); // Test no serializer configs are loaded $resources = $this->container->getResources(); /** @var FileResource $resource */ foreach ($resources as $resource) { $this->assertNotContains('EventBand/SymfonyBundle/Resources/config/serializer/', $resource->getResource()); } }
/** * Build the container. * * @param string $configDir * @param string $configFile * @param string $className * @param string $namespace * * @return Container */ public function build($configDir, $configFile, $className = 'CachedContainer', $namespace = 'Cache') { if ($this->debug) { // provides useful info regarding namespace when in debug, ignored in prod for performance self::checkNamespace($namespace); self::checkClassName($className); } $fqClassName = '\\' . $namespace . '\\' . $className; $cacheFile = $this->cacheDir . '/' . $className . '.php'; $configCache = new ConfigCache($cacheFile, $this->debug); if (!$configCache->isFresh()) { $containerBuilder = new ContainerBuilder(); $loader = new YamlFileLoader($containerBuilder, new FileLocator($configDir)); $loader->load($configFile); $containerBuilder->compile(); $dumper = new PhpDumper($containerBuilder); $configCache->write($dumper->dump(['class' => $className, 'namespace' => $namespace]), $containerBuilder->getResources()); } return new $fqClassName(); }
public function process(ContainerBuilder $container) { $resources = $directories = array(); $ref = new \ReflectionProperty('Symfony\\Component\\Config\\Resource\\DirectoryResource', 'pattern'); $ref->setAccessible(true); foreach ($container->getResources() as $resource) { if ($resource instanceof DirectoryResource) { if (null === ($pattern = $ref->getValue($resource))) { $pattern = '*'; } $directories[$pattern][] = $resource->getResource(); continue; } $resources[] = $resource; } $sortFunc = function ($a, $b) { return strlen($a) - strlen($b); }; foreach ($directories as $pattern => $pDirectories) { $newResources = array(); usort($pDirectories, $sortFunc); foreach ($pDirectories as $a) { foreach ($newResources as $b) { if (0 === strpos($a, $b)) { continue 2; } } $newResources[] = $a; } $directories[$pattern] = $newResources; } $disableGrep = $container->getParameter('jms_di_extra.disable_grep'); foreach ($directories as $pattern => $pDirectories) { $newResource = new FastDirectoriesResource($pDirectories, $pattern, $disableGrep); $newResource->update(); $resources[] = $newResource; } $ref = new \ReflectionProperty('Symfony\\Component\\DependencyInjection\\ContainerBuilder', 'resources'); $ref->setAccessible(true); $ref->setValue($container, $resources); }
/** * Returns a new created container instance. * * @param string $environment * @param bool $debug * * @return ContainerInterface */ public function create($environment, $debug = false) { $cachedContainerClassName = ucfirst($environment) . ($debug ? 'Debug' : '') . 'Container'; $cache = new ConfigCache($this->cacheDir . '/' . $cachedContainerClassName . '.php', $debug); if (!$cache->isFresh()) { $container = new ContainerBuilder(new ParameterBag(['environment' => $environment, 'debug' => $debug])); $container->addObjectResource($this); foreach ($this->loaders as $loader) { (new ClosureLoader($container))->load($loader); } $container->compile(); $dumper = new PhpDumper($container); $content = $dumper->dump(['class' => stristr(basename($cache->getPath()), '.', true)]); $cache->write($debug ? $content : self::stripComments($content), $container->getResources()); if ($debug) { self::dumpForDebug(preg_replace('/\\.php/', '.xml', $cache->getPath()), $container); } } require_once $cache->getPath(); return new $cachedContainerClassName(); }
/** * {@inheritdoc} */ public function init(array $options = array()) { $file = rtrim($options['cacheDir'], '/') . '/AspectServiceContainer.php'; $containerConfigCache = new ConfigCache($file, !empty($options['debug'])); if (!$containerConfigCache->isFresh()) { $container = new ContainerBuilder(); $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/Resources')); $loader->load('components.xml'); $loader->load('aspect.xml'); $loader->load('demo_aspects.xml'); // TODO: Remove this hardcoded example $container->addCompilerPass(new ComponentScannerPass($options['appDir'] . '/src')); $container->addCompilerPass(new AspectCollectorPass()); $container->addCompilerPass(new InterfaceBinderPass(), PassConfig::TYPE_AFTER_REMOVING); $container->setParameter('kernel.interceptFunctions', !empty($options['interceptFunctions'])); $container->compile(); $dumper = new PhpDumper($container); $containerConfigCache->write($dumper->dump(array('base_class' => 'Warlock\\WarlockContainer', 'class' => static::$containerClass)), $container->getResources()); } require_once $file; parent::init($options); $this->container->addResource($file); }
/** * Merges a ContainerBuilder with the current ContainerBuilder configuration. * * Service definitions overrides the current defined ones. * * But for parameters, they are overridden by the current ones. It allows * the parameters passed to the container constructor to have precedence * over the loaded ones. * * $container = new ContainerBuilder(array('foo' => 'bar')); * $loader = new LoaderXXX($container); * $loader->load('resource_name'); * $container->register('foo', new stdClass()); * * In the above example, even if the loaded resource defines a foo * parameter, the value will still be 'bar' as defined in the ContainerBuilder * constructor. * * @param ContainerBuilder $container The ContainerBuilder instance to merge * * @throws BadMethodCallException When this ContainerBuilder is frozen */ public function merge(ContainerBuilder $container) { if ($this->isFrozen()) { throw new BadMethodCallException('Cannot merge on a frozen container.'); } $this->addDefinitions($container->getDefinitions()); $this->addAliases($container->getAliases()); $this->getParameterBag()->add($container->getParameterBag()->all()); if ($this->trackResources) { foreach ($container->getResources() as $resource) { $this->addResource($resource); } } foreach ($this->extensions as $name => $extension) { if (!isset($this->extensionConfigs[$name])) { $this->extensionConfigs[$name] = array(); } $this->extensionConfigs[$name] = array_merge($this->extensionConfigs[$name], $container->getExtensionConfig($name)); } if ($this->getParameterBag() instanceof EnvPlaceholderParameterBag && $container->getParameterBag() instanceof EnvPlaceholderParameterBag) { $this->getParameterBag()->mergeEnvPlaceholders($container->getParameterBag()); } foreach ($container->envCounters as $env => $count) { if (!isset($this->envCounters[$env])) { $this->envCounters[$env] = $count; } else { $this->envCounters[$env] += $count; } } }
/** * Merges a ContainerBuilder with the current ContainerBuilder configuration. * * Service definitions overrides the current defined ones. * * But for parameters, they are overridden by the current ones. It allows * the parameters passed to the container constructor to have precedence * over the loaded ones. * * $container = new ContainerBuilder(array('foo' => 'bar')); * $loader = new LoaderXXX($container); * $loader->load('resource_name'); * $container->register('foo', new stdClass()); * * In the above example, even if the loaded resource defines a foo * parameter, the value will still be 'bar' as defined in the ContainerBuilder * constructor. * * @param ContainerBuilder $container The ContainerBuilder instance to merge. * * @throws BadMethodCallException When this ContainerBuilder is frozen */ public function merge(ContainerBuilder $container) { if ($this->isFrozen()) { throw new BadMethodCallException('Cannot merge on a frozen container.'); } $this->addDefinitions($container->getDefinitions()); $this->addAliases($container->getAliases()); $this->getParameterBag()->add($container->getParameterBag()->all()); if ($this->trackResources) { foreach ($container->getResources() as $resource) { $this->addResource($resource); } } foreach ($this->extensions as $name => $extension) { if (!isset($this->extensionConfigs[$name])) { $this->extensionConfigs[$name] = array(); } $this->extensionConfigs[$name] = array_merge($this->extensionConfigs[$name], $container->getExtensionConfig($name)); } }
private function prepareContainer($cache, $containerFilename, $metadata, $className) { $container = new ContainerBuilder(); $container->setParameter('jms_aop.cache_dir', $this->container->getParameter('jms_di_extra.cache_dir')); $def = $container->register('jms_aop.interceptor_loader', 'JMS\\AopBundle\\Aop\\InterceptorLoader')->addArgument(new Reference('service_container'))->setPublic(false); // add resources $ref = $metadata->getOutsideClassMetadata()->reflection; while ($ref && false !== ($filename = $ref->getFilename())) { $container->addResource(new FileResource($filename)); $ref = $ref->getParentClass(); } // add definitions $definitions = $this->container->get('jms_di_extra.metadata.converter')->convert($metadata); $serviceIds = $parameters = array(); $controllerDef = array_pop($definitions); $container->setDefinition('controller', $controllerDef); foreach ($definitions as $id => $def) { $container->setDefinition($id, $def); } $this->generateLookupMethods($controllerDef, $metadata); $config = $container->getCompilerPassConfig(); $config->setOptimizationPasses(array()); $config->setRemovingPasses(array()); $config->addPass(new ResolveDefinitionTemplatesPass()); $config->addPass(new PointcutMatchingPass($this->container->get('jms_aop.pointcut_container')->getPointcuts())); $config->addPass(new InlineServiceDefinitionsPass()); $container->compile(); if (!file_exists($dir = dirname($containerFilename))) { if (false === @mkdir($dir, 0777, true)) { throw new \RuntimeException(sprintf('Could not create directory "%s".', $dir)); } } static $generator; if (null === $generator) { $generator = new DefinitionInjectorGenerator(); } $cache->write($generator->generate($container->getDefinition('controller'), $className), $container->getResources()); }
protected function dumpContainer(ContainerBuilder $container, $class, $file) { foreach (array('cache', 'logs') as $name) { $dir = $container->getParameter(sprintf('kernel.%s_dir', $name)); if (!is_dir($dir)) { if (false === @mkdir($dir, 0777, true)) { die(sprintf('Unable to create the %s directory (%s)', $name, dirname($dir))); } } elseif (!is_writable($dir)) { die(sprintf('Unable to write in the %s directory (%s)', $name, $dir)); } } // cache the container $dumper = new PhpDumper($container); $content = $dumper->dump(array('class' => $class)); if (!$this->debug) { $content = self::stripComments($content); } $this->writeCacheFile($file, $content); if ($this->debug) { $container->addObjectResource($this); // save the resources $this->writeCacheFile($this->getCacheDir() . '/' . $class . '.meta', serialize($container->getResources())); } }
/** * @covers Symfony\Component\DependencyInjection\ContainerBuilder::getResources * @covers Symfony\Component\DependencyInjection\ContainerBuilder::addResource */ public function testResources() { $container = new ContainerBuilder(); $container->addResource($a = new FileResource(__DIR__ . '/Fixtures/xml/services1.xml')); $container->addResource($b = new FileResource(__DIR__ . '/Fixtures/xml/services2.xml')); $resources = array(); foreach ($container->getResources() as $resource) { if (false === strpos($resource, '.php')) { $resources[] = $resource; } } $this->assertEquals(array($a, $b), $resources, '->getResources() returns an array of resources read for the current configuration'); $this->assertSame($container, $container->setResources(array())); $this->assertEquals(array(), $container->getResources()); }
/** * Dumps the service container to PHP code in the cache. * * @param ConfigCache $cache The config cache * @param ContainerBuilder $container The service container * @param string $class The name of the class to generate * @param string $baseClass The name of the container's base class */ protected function dumpContainer(ConfigCache $cache, ContainerBuilder $container, $class, $baseClass) { // cache the container $dumper = new PhpDumper($container); $content = $dumper->dump(array('class' => $class, 'base_class' => $baseClass)); if (!$this->debug) { $content = self::stripComments($content); } $cache->write($content, $container->getResources()); }
/** * {@inheritdoc} */ protected function dumpContainer(ConfigCache $cache, ContainerBuilder $container, $class, $baseClass) { // cache the container $dumper = new PhpDumper($container); if ($container->getParameter('installed') && class_exists('ProxyManager\\Configuration') && class_exists('Symfony\\Bridge\\ProxyManager\\LazyProxy\\PhpDumper\\ProxyDumper')) { $dumper->setProxyDumper(new ProxyDumper(md5($cache->getPath()))); } $content = $dumper->dump(array('class' => $class, 'base_class' => $baseClass, 'file' => $cache->getPath())); if (!$this->debug) { $content = static::stripComments($content); } $cache->write($content, $container->getResources()); }
protected function dumpContainer(ConfigCache $cache, ContainerBuilder $container, $class) { foreach (array('cache', 'logs') as $name) { $dir = $container->getParameter(sprintf('kernel.%s_dir', $name)); if (!is_dir($dir)) { if (false === @mkdir($dir, 0777, true)) { die(sprintf("Unable to create the %s directory (%s)\n", $name, dirname($dir))); } } elseif (!is_writable($dir)) { die(sprintf("Unable to write in the %s directory (%s)\n", $name, $dir)); } } $dumper = new PhpDumper($container); $content = $dumper->dump(array('class' => $class)); if (!$this->debug) { $content = self::stripComments($content); } $cache->write($content, $container->getResources()); }
/** * Dumps the service container to PHP code in the cache. * * @param ConfigCache $cache The config cache * @param ContainerBuilder $container The service container * @param string $class The name of the class to generate * @param string $baseClass The name of the container's base class */ protected function dumpContainer(ConfigCache $cache, ContainerBuilder $container, $class, $baseClass) { // cache the container $dumper = new PhpDumper($container); if (class_exists('ProxyManager\Configuration') && class_exists('Symfony\Bridge\ProxyManager\LazyProxy\PhpDumper\ProxyDumper')) { $dumper->setProxyDumper(new ProxyDumper(md5($cache->getPath()))); } $content = $dumper->dump(array('class' => $class, 'base_class' => $baseClass, 'file' => $cache->getPath(), 'debug' => $this->debug)); $cache->write($content, $container->getResources()); }
/** * Merges a ContainerBuilder with the current ContainerBuilder configuration. * * Service definitions overrides the current defined ones. * * But for parameters, they are overridden by the current ones. It allows * the parameters passed to the container constructor to have precedence * over the loaded ones. * * $container = new ContainerBuilder(array('foo' => 'bar')); * $loader = new LoaderXXX($container); * $loader->load('resource_name'); * $container->register('foo', new stdClass()); * * In the above example, even if the loaded resource defines a foo * parameter, the value will still be 'bar' as defined in the ContainerBuilder * constructor. */ public function merge(ContainerBuilder $container) { if (true === $this->isFrozen()) { throw new \LogicException('Cannot merge on a frozen container.'); } $this->addDefinitions($container->getDefinitions()); $this->addAliases($container->getAliases()); $this->parameterBag->add($container->getParameterBag()->all()); foreach ($container->getResources() as $resource) { $this->addResource($resource); } foreach ($container->getExtensionContainers() as $name => $container) { if (isset($this->extensionContainers[$name])) { $this->extensionContainers[$name]->merge($container); } else { $this->extensionContainers[$name] = $container; } } }
public function getResources() { return $this->delegate->getResources(); }
protected function cacheContainer(ContainerBuilder $container, ConfigCache $cache, $class) { $dumper = new PhpDumper($container); $content = $dumper->dump(array('class' => $class, 'base_class' => 'Drupony\\Component\\DependencyInjection\\DruponyContainerBuilder')); $cache->write($content, $container->getResources()); }
/** * @covers Symfony\Component\DependencyInjection\ContainerBuilder::getResources * @covers Symfony\Component\DependencyInjection\ContainerBuilder::addResource */ public function testResources() { if (!class_exists('Symfony\\Component\\Config\\Resource\\FileResource')) { $this->markTestSkipped('The "Config" component is not available'); } $container = new ContainerBuilder(); $container->addResource($a = new FileResource(__DIR__ . '/Fixtures/xml/services1.xml')); $container->addResource($b = new FileResource(__DIR__ . '/Fixtures/xml/services2.xml')); $resources = array(); foreach ($container->getResources() as $resource) { if (false === strpos($resource, '.php')) { $resources[] = $resource; } } $this->assertEquals(array($a, $b), $resources, '->getResources() returns an array of resources read for the current configuration'); $this->assertSame($container, $container->setResources(array())); $this->assertEquals(array(), $container->getResources()); }
/** * Dumps the service container to PHP code in the cache. * * @param ConfigCache $cache The config cache * @param ContainerBuilder $container The service container * @param string $class The name of the class to generate * @param string $baseClass The name of the container's base class */ protected function dumpContainer(ConfigCache $cache, ContainerBuilder $container, $class, $baseClass) { // cache the container $dumper = new PhpDumper($container); if (class_exists('ProxyManager\Configuration')) { $dumper->setProxyDumper(new ProxyDumper()); } $content = $dumper->dump(array('class' => $class, 'base_class' => $baseClass)); if (!$this->debug) { $content = static::stripComments($content); } $cache->write($content, $container->getResources()); }
/** * {@inheritdoc} */ protected function dumpContainer(ConfigCache $cache, ContainerBuilder $container, $class, $baseClass) { // cache the container $dumper = new PhpDumper($container); if ($container->getParameter('installed') && class_exists('ProxyManager\\Configuration')) { $dumper->setProxyDumper(new ProxyDumper()); } $content = $dumper->dump(array('class' => $class, 'base_class' => $baseClass)); $cache->write($content, $container->getResources()); if (!$this->debug) { $cache->write(php_strip_whitespace($cache), $container->getResources()); } }