function Invoke-Hook() {
    param(
        [string] $Name,
        [scriptblock] $Fallback
    )

    if ($Fallback) {
        $scriptBlock = $Fallback;
    } else {
        $scriptBlock = { };
    }

    if (Get-Command "$Name" -ErrorAction SilentlyContinue) {
        $parameters = {
            fallback = $scriptBlock
        };

        Write-Host "Running Hook ``$Name``";
        & "$Name" @parameters;
    } elseif ($Fallback) {
        Write-Host "Running Default of Hook ``$Name``";
        & $scriptBlock;
    } else {
        Write-Host "Hook ``$Name``";
    }
}