EZOut.psm1

[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseDeclaredVarsMoreThanAssignments", "", Justification="Using Within the Module")]
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidGlobalVars", "", Justification="Allowing Extensibility")]
param()
$Script:FormatModules = @{}
$script:TypeModules = @{}

$commandsPath = Join-Path $psScriptRoot "Commands"

:ToIncludeFiles foreach ($file in (Get-ChildItem -Path "$commandsPath" -Filter "*-*" -Recurse)) {
    if ($file.Extension -ne '.ps1')      { continue }  # Skip if the extension is not .ps1
    foreach ($exclusion in '\.[^\.]+\.ps1$') {
        if (-not $exclusion) { continue }
        if ($file.Name -match $exclusion) {
            continue ToIncludeFiles  # Skip excluded files
        }
    }
    . $file.FullName
}

. $psScriptRoot\@.ps1 # Import Splatter

$myInvocation.MyCommand.ScriptBlock.Module.pstypenames.insert(0,'EZOut.RichModuleInfo')

#region Import Parts

# Parts are simple .ps1 files beneath a /Parts directory that can be used throughout the module.
$partsDirectory = $( # Because we want to be case-insensitive, and because it's fast
    foreach ($dir in [IO.Directory]::GetDirectories($psScriptRoot)) { # [IO.Directory]::GetDirectories()
        if ($dir -imatch "\$([IO.Path]::DirectorySeparatorChar)Parts$") { # and some Regex
            [IO.DirectoryInfo]$dir;break # to find our parts directory.
        }
    })

if ($partsDirectory) { # If we have parts directory
    foreach ($partFile in $partsDirectory.EnumerateFileSystemInfos()) { # enumerate all of the files.
        if ($partFile.Extension -ne '.ps1') { continue } # Skip anything that's not a PowerShell script.
        $partName = # Get the name of the script.
            $partFile.Name.Substring(0, $partFile.Name.Length - $partFile.Extension.Length)
        $ExecutionContext.SessionState.PSVariable.Set( # Set a variable
            $partName, # named the script that points to the script (e.g. $foo = gcm .\Parts\foo.ps1)
            $ExecutionContext.SessionState.InvokeCommand.GetCommand($partFile.Fullname, 'ExternalScript').ScriptBlock
        )
    }
}
#endregion Import Parts



Update-FormatData -PrependPath $psScriptRoot\EZOut.format.ps1xml
$myModule = $myInvocation.MyCommand.ScriptBlock.Module
$executionContext.SessionState.PSVariable.Set(
    $myModule.Name,
    $myModule
)

Export-ModuleMember -Function * -Alias * -Variable $myModule.Name

try {
    $newDriveSplat = @{Name = $myModule.Name;Scope = 'Global';PSProvider='FileSystem';ErrorAction='Ignore'}
    $newDriveSplat.Root = $myModule | Split-Path
    New-PSDrive @newDriveSplat
} catch {
    Write-Verbose "$_"
}

$myModule.OnRemove = {
    $myModule = Get-Module EZOut
    $debuggingTypeNames = $myModule.DebuggingTypeNames
    if ($debuggingTypeNames) {        
        foreach ($typeName in $debuggingTypeNames | Select-Object -Unique) {
            try {
                Remove-TypeData -TypeName $typeName -Confirm:$false -ErrorAction Ignore
            } catch {
                Write-Verbose "$_"
            }
        }
    }
    Clear-FormatData
    Clear-TypeData    
}