+ /**
+ * Add a newly installed extension to the active classloader.
+ *
+ * NOTE: This is intended for use by CRM/Extension subsystem during installation.
+ *
+ * @param \CRM_Extension_Info $info
+ * @param string $path
+ */
+ public function installExtension(CRM_Extension_Info $info, string $path): void {
+ $file = $this->getCacheFile();
+ if (file_exists($file)) {
+ unlink($file);
+ }
+ if ($this->loader) {
+ self::loadExtension($this->loader, $info, $path);
+ }
+ }
+
+ /**
+ * Read the extension metadata configure a classloader.
+ *
+ * @param \Composer\Autoload\ClassLoader $loader
+ * @param \CRM_Extension_Info $info
+ * @param string $path
+ */
+ private static function loadExtension(\Composer\Autoload\ClassLoader $loader, CRM_Extension_Info $info, string $path): void {
+ if (!empty($info->classloader)) {
+ foreach ($info->classloader as $mapping) {
+ switch ($mapping['type']) {
+ case 'psr0':
+ $loader->add($mapping['prefix'], CRM_Utils_File::addTrailingSlash($path . '/' . $mapping['path']));
+ break;
+
+ case 'psr4':
+ $loader->addPsr4($mapping['prefix'], $path . '/' . $mapping['path']);
+ break;
+ }
+ }
+ }
+ }
+