PowerShellBuddy.psm1

using namespace System.Management.Automation

$publicScripts = @(
    Get-ChildItem -Path (Join-Path $PSScriptRoot 'Public') -Filter '*.ps1' -Exclude '*.Tests.ps1' -File |
        Sort-Object -Property Name
)

foreach ($scriptFile in $publicScripts) {
    . $scriptFile.FullName
}

$functionsToExport = @(
    $publicScripts.BaseName |
        Sort-Object -Unique
)

Export-ModuleMember -Function $functionsToExport

$MyInvocation.MyCommand.ScriptBlock.Module.OnRemove = {
    try {
        Get-Job -Name 'PowerShellBuddy-*' -ErrorAction SilentlyContinue |
            Remove-Job -Force -ErrorAction SilentlyContinue

        Get-EventSubscriber -ErrorAction SilentlyContinue |
            Where-Object SourceIdentifier -like 'PowerShellBuddy-*' |
            Unregister-Event -ErrorAction SilentlyContinue

        Get-Variable -Name 'PowerShellBuddy*' -Scope Script -ErrorAction SilentlyContinue |
            ForEach-Object {
                Remove-Variable -Name $_.Name -Scope Script -Force -ErrorAction SilentlyContinue
            }
    }
    catch {
    }
}