Data/PSObject/ObjectModel/Set-ObjectProperty.ps1

function Set-ObjectProperty {
    [CmdletBinding(SupportsShouldProcess)]
    param(
        [Parameter(Mandatory)][Alias('InputObject')][PSCustomObject]$ObjectModel,
        # expects each key to have the path to the item in the object model
        [Parameter(ParameterSetName = 'Hashtable', Mandatory)][hashtable]$Hashtable,
        [Parameter(ParameterSetName = 'Single', Mandatory)][string]$Path,
        [Parameter(ParameterSetName = 'Single')][object]$Value,
        [Parameter()][switch]$SecretsOnly
    )
    function Set-ObjectModelValueSingle {
        [CmdletBinding(SupportsShouldProcess)]
        param(
            [Parameter(Mandatory)][PSCustomObject]$ObjectModel,
            [Parameter(Mandatory)][string]$Path,
            [Parameter()][object]$Value,
            [Parameter()][switch]$SecretsOnly
        )

        if ($SecretsOnly.IsPresent -and $Value.GetType().Name -ne "SecureString") {
            throw "SecretsOnly specified but non SecureString value given"
        }
        $propertyName = ($path.Split('.'))[-1]
        Write-Debug "`$propertyName:$propertyName"
        if (-not $path.Contains('.')) {
            if ($PSCmdlet.ShouldProcess('Set value')) {
                $ObjectModel | Add-member NoteProperty -Name $propertyName -Value $Value -force
            }
        }
        else {
            $baseObjectPath = $path.Substring(0, $path.LastIndexOf('.'))
            Write-Debug "`$baseObjectPath:$baseObjectPath"
            if ($PSCmdlet.ShouldProcess('Set value')) {
                Get-ObjectModelValue -ObjectModel $ObjectModel -Path $baseObjectPath |
                Add-member NoteProperty -Name $propertyName -Value $Value -force
            }
        }
    }

    if ($PSCmdlet.ParameterSetName -eq 'Single') {
        $splat = @{
            ObjectModel = $ObjectModel
            SecretsOnly = $SecretsOnly
            Path        = $Path
            Value       = $Value
        }
        Set-ObjectModelValueSingle @splat
    }
    else {
        foreach ($_item in $Hashtable.GetEnumerator()) {
            $splat = @{
                ObjectModel = $ObjectModel
                SecretsOnly = $SecretsOnly
                Path        = $_item.Key
                Value       = $_item.Value
            }
            Set-ObjectModelValueSingle @splat
        }
    }

}
# add alias Set-ObjectModelValue for Set-ObjectProperty
Set-Alias -Name Set-ObjectModelValue -Value Set-ObjectProperty