Utilities/Invoke-ExpressionCacheProviderHook.ps1

function Invoke-ExpressionCacheProviderHook {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$ProviderName,

        [Parameter(Mandatory)]
        [ValidateSet('ClearCache', 'GetOrCreate', 'Initialize', 'Teardown')]
        [string]$Hook,

        [hashtable]$Arguments = @{}
    )

    $provider = Find-ExpressionCacheProvider -ProviderName $ProviderName
    if (-not $provider) { 
        throw "ExpressionCache: Provider '$ProviderName' not found." 
    }

    $fnName = $provider.$Hook
    
    if (-not $fnName) { 
        Write-Verbose "ExpressionCache: Invoke-ExpressionCacheProviderHook requested, but hook '$Hook' was not found on provider '$ProviderName'"
        return $false 
    }

    $command = Get-Command -Name $fnName -CommandType Function, Cmdlet, ExternalScript -ErrorAction SilentlyContinue
    if (-not $command) {
        throw "ExpressionCache: Hook '$Hook' for provider '$ProviderName' points to '$fnName', but the function was not found."
    }

    $splat = New-CallableSplat -CommandName $fnName `
        -Config $provider.Config `
        -Arguments $Arguments `
        -PreferArgs

    & $fnName @splat

    return $true
}