public static function getPkg(PkgNameInterface $pkgName)
 {
     $vendor = $pkgName->getVendor();
     $factory = self::loadFactory($vendor);
     $type = $pkgName->getType();
     $name = $pkgName->getName();
     $pkg = null;
     if ('layer' === $type) {
         $data = ResourceTree::getLayer($vendor, $name);
         if (!isset($data['pkg'])) {
             $err = "pkg must be defined for layer -({$vendor}, {$name})";
             throw new DomainException($err);
         }
         if (!isset($data['filename'])) {
             $err = "filename must be defined for layer -({$vendor}, {$name})";
             throw new DomainException($err);
         }
         $pkg = $factory->createLayer($name, self::loadVendor($vendor));
         $pkg->setFilename($data['filename'])->setPackages($data['pkg']);
     } else {
         if (empty($type)) {
             $pkg = ResourceTree::getPackage($vendor, $name);
             if (is_array($pkg)) {
                 $pkg = $factory->createPkg($pkg, $vendor);
                 ResourceTree::setPackage($vendor, $name, $pkg);
             }
         } else {
             $pkg = ResourceTree::getPackageByType($vendor, $type, $name);
             if (is_array($pkg)) {
                 $pkg = $factory->createPkg($pkg, $vendor);
                 ResourceTree::setPackageByType($vendor, $type, $name, $pkg);
             }
         }
     }
     return $pkg;
 }