public static function getPackagesData($packagesPath)
    {
        $packagesData = array();
        $packagesDirectoryIterator = new \DirectoryIterator($packagesPath);
        foreach ($packagesDirectoryIterator as $categoryFileInfo) {
            $category = $categoryFileInfo->getFilename();
            if (!$categoryFileInfo->isDir() || $category[0] === '.' || $category === 'Libraries') {
                continue;
            }

            $categoryDirectoryIterator = new \DirectoryIterator($categoryFileInfo->getPathname());
            foreach ($categoryDirectoryIterator as $packageFileInfo) {
                $packageKey = $packageFileInfo->getFilename();
                if (!$packageFileInfo->isDir() || $packageKey[0] === '.') {
                    continue;
                }

                $meta = self::readPackageMetaData(Files::concatenatePaths(array($packageFileInfo->getPathname(), 'Meta/Package.xml')));
                $composerManifest = self::readComposerManifest(Files::concatenatePaths(array($packageFileInfo->getPathname(), 'composer.json')));

                $packagesData[$packageKey] = array(
                    'packageKey' => $packageKey,
                    'category' => $category,
                    'path' => $packageFileInfo->getPathname(),
                    'meta' => $meta,
                    'composerManifest' => $composerManifest
                );
            }
        }
        return $packagesData;
    }