Data/PSObject/ObjectModel/Get-ObjectModelValue.ps1

function Get-ObjectModelValue {
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute(<#Category#>'PSAvoidUsingInvokeExpression', <#CheckId#>'', Justification = 'We are protecting the call to ensure that it is safe before Invoking', Scope='function')]
    param(
        [Parameter(Mandatory)][PSCustomObject]$ObjectModel,
        [Parameter(Mandatory)][string]$Path,
        # array of known secret paths to check against for extra checking
        [Parameter()][string[]]$KnownSecrets = @()
    )
    # TODO change this to walking up the properties
    # Also check we are PSCustomObject all the way to prevent mistakes forgetting to convert hashtable to pscustobject
    # Only execute this if we think it is safe to prevent injection attacks
    if (Test-ObjectModelPathIsSafe -ObjectModel $ObjectModel -Path $path -KnownSecrets $KnownSecrets) {
        $out = Invoke-Expression "`$ObjectModel.$Path"
        if ($out.GetType().Name -eq 'PropertyName') {
            $out = $out.Value
        }
        return $out
    }
}