New-Module {
    class AppAssociations {
        static $associationSelector = "/DefaultAssociations/Association";

        static [string] GetSelector([string] $identifier) {
            return "$([AppAssociations]::associationSelector)[Identifier='$identifier']";
        }

        static [xml] GetAppAssociations() {
            [xml] $associations = (DISM /Online /Get-DefaultAppAssociations) | Select-Object -Skip 6 | Select-Object -SkipLast 2 | Out-String;
            return $associations;
        }

        static SetAssociation([string] $identifier, [string] $progId, [string] $applicationName) {
            $associations = [AppAssociations]::GetAppAssociations();
            [System.Xml.XmlNode] $association = $null;
            $candidates = $associations.SelectNodes([AppAssociations]::GetSelector($identifier));

            if ($candidates.Count -eq 1) {
                $association = $candidates[0];
            } else {
                $association = ($associations.SelectNodes([AppAssociations]::associationSelector) | Select-Object -Last 1)[0];
                $association.Identifier = $identifier;
                $association = $associations.AppendChild($association);
            }

            $association.ProgId = $progId;
            $association.ApplicationName = $applicationName;
        }
    }

    function Set-Association {
        param (
            [string] $Identifier,
            [string] $ProgId,
            [string] $ApplicationName
        )

        [AppAssociations]::SetAssociation($Identifier, $ProgId, $ApplicationName);
    }
}