sthArgumentCompleterFunctions.ps1

function Get-CustomArgumentCompleter
{
    [CmdletBinding(DefaultParameterSetName='Name')]

    Param (
        [ArgumentCompleter([sthCustomArgumentCompleter])]
        [string]$Name
    )

    $argumentCompleters = inGetArgumentCompleter -Type Custom

    if ($Name)
    {
        $argumentCompleters.$Name
    }
    else
    {
        $argumentCompleters
    }
}

function Get-NativeArgumentCompleter
{
    Param (
        [ArgumentCompleter([sthNativeArgumentCompleter])]
        [string]$Name
    )
    
    $argumentCompleters = inGetArgumentCompleter -Type Native

    if ($Name)
    {
        $argumentCompleters.$Name
    }
    else
    {
        $argumentCompleters
    }
}

function Remove-CustomArgumentCompleter
{
    Param (
        [Parameter(Mandatory)]
        [ArgumentCompleter([sthCustomArgumentCompleter])]
        [string[]]$Name
    )

    $argumentCompleters = inGetArgumentCompleter -Type Custom

    foreach ($n in $Name)
    {
        if (!$argumentCompleters.Remove($n))
        {
            Write-Error -Message "There are no argument completer `"$n`"." -ErrorId "ArgumentError" -Category InvalidArgument
        }
    }
}

function Remove-NativeArgumentCompleter
{
    Param (
        [Parameter(Mandatory)]
        [ArgumentCompleter([sthNativeArgumentCompleter])]
        [string[]]$Name
    )

    $argumentCompleters = inGetArgumentCompleter -Type Native

    foreach ($n in $Name)
    {
        if (!$argumentCompleters.Remove($n))
        {
            Write-Error -Message "There are no argument completer `"$n`"." -ErrorId "ArgumentError" -Category InvalidArgument
        }
    }
}

function Clear-CustomArgumentCompleters
{
    $argumentCompleters = inGetArgumentCompleter -Type Custom

    if ($argumentCompleters)
    {
        $argumentCompleters.Clear()
    }
}

function Clear-NativeArgumentCompleters
{
    $argumentCompleters = inGetArgumentCompleter -Type Native

    if ($argumentCompleters)
    {
        $argumentCompleters.Clear()
    }
}


function inGetArgumentCompleter
{
    Param (
        [Parameter(Mandatory)]
        [ValidateSet('Custom','Native')]
        $Type
    )

    $flags = [System.Reflection.BindingFlags]'Instance,NonPublic'
    $_context = $ExecutionContext.GetType().GetField('_context',$flags).GetValue($ExecutionContext)

    if ($Type -eq 'Custom')
    {
        $_context.GetType().GetProperty('CustomArgumentCompleters',$flags).GetValue($_context)
    }
    else
    {
        $_context.GetType().GetProperty('NativeArgumentCompleters',$flags).GetValue($_context)
    }
}