public bool IsInstallationValid(out ErrorSummary errors)
        {
            if (errorSummary != null)
            {
                errors = errorSummary;
                return(errors.IsEmpty());
            }

            errors       = new ErrorSummary();
            errorSummary = errors;

            PluginData data = PluginsManifest.Instance.GetPluginData(this);

            if (data.installed == false)
            {
                return(false);
            }

            foreach (var symbol in GetSymbols())
            {
                if (DefineSymbols.Instance.IsEnabled(symbol.symbolName) == false)
                {
                    errors.RegisterInvalidItem($"{symbol.symbolName}", PluginDependencyType.DefineSymbol);
                }
            }

            foreach (ModuleInstallInfo moduleInfo in GetModules())
            {
                if (ModuleInstaller.IsModuleInstallationValid(moduleInfo) == false)
                {
                    errors.RegisterInvalidItem($"{AssetDatabase.GetAssetPath(moduleInfo)}", PluginDependencyType.Module);
                }
            }

            foreach (PackageDependency packageDependency in GetPackages())
            {
                if (Util.HasPackageDependency(packageDependency.packageName, packageDependency.version) == false)
                {
                    errors.RegisterInvalidItem($"{packageDependency.FullName}", PluginDependencyType.Package);
                }
            }

            foreach (PluginInfo dependency in GetDependencies())
            {
                if (dependency == this)
                {
                    Debug.LogWarning($"Circular dependency: {description} depends on itself!");
                    continue;
                }
                if (dependency == null)
                {
                    Debug.LogWarning($"Empty dependency detected on {description}!");
                    continue;
                }
                if (dependency.IsInstallationValid(out var depErrors) == false)
                {
                    errors.RegisterInvalidItem($"{AssetDatabase.GetAssetPath(dependency)}", PluginDependencyType.Plugin);
                }
            }

            return(errors.IsEmpty());
        }