InternalFunctions/ConvertPSObjectToHashtable.ps1

function ConvertPSObjectToHashtable
{
    param (
        [Parameter(ValueFromPipeline)]
        $InputObject
    )

    process
    {
        if ($null -eq $InputObject) { return $null }

        if ($InputObject -is [System.Array] -and $InputObject -isnot [string])
        {
            $collection = @($InputObject | ConvertPSObjectToHashtable)

            ,$collection
        }
        elseif ($InputObject -is [System.Management.Automation.PSCustomObject])
        {
            $hash = [ordered]@{}

            foreach ($property in $InputObject.PSObject.Properties)
            {
                $hash[$property.Name] = ConvertPSObjectToHashtable $property.Value
            }

            $hash
        }
        else
        {
            $InputObject
        }
    }
}