EventSources/@VariableSet.ps1

<#
.Synopsis
    Watches for variable sets.
.Description
    Watches for assignments to a variable.
    
    Events are sent directly after the variable is set.
    
    The -Sender is the callstack, The -MessageData is the value of the variable.
#>

param(
# The name of the variable
[Parameter(Mandatory,ValueFromPipelineByPropertyName)]
[string]
$VariableName
)

process {
    Get-PSBreakpoint | Where-Object Variable -eq $VariableName | Remove-PSBreakpoint

    $raiseEvent = [ScriptBlock]::Create(@"
New-Event -SourceIdentifier 'VariableSet.$variableName' -MessageData `$$variableName -Sender (Get-PSCallstack)
continue
"@
)
    Set-PSBreakpoint -Variable $VariableName -Action $raiseEvent | Out-Null

    [PSCustomObject]@{SourceIdentifier="VariableSet.$variableName"}
}