Get-GitPub.ps1

function Get-GitPub {
    <#
    .SYNOPSIS
        Gets GitPub
    .DESCRIPTION
        Gets GitPub.
        
        Returns the version and currently loaded Publishers and Sources.
    .EXAMPLE
        Get-GitPub
    .LINK
        Publish-GitPub
    #>

    param()
    process {
        $sourceFunctions =             
$(
# Collect all items into an input collection
$inputCollection =$(
$executionContext.SessionState.InvokeCommand.GetCommands('*','Function',$true)
)
# 'unroll' the collection by iterating over it once.
$filteredCollection = $inputCollection =
    @(foreach ($in in $inputCollection) {
        $in
    })
# Since filtering conditions have been passed, we must filter item-by-item
$filteredCollection = :nextItem foreach ($item in $inputCollection) {
    # we set $this, $psItem, and $_ for ease-of-use.
    $this = $_ = $psItem = $item
 
    # Some of the items may be variables.
    if ($item -is [Management.Automation.PSVariable]) {
        # In this case, reassign them to their value.
        $this = $_ = $psItem = $item = $item.Value
    }
    
    # Some of the items may be enumerables
    $unrolledItems = 
        if ($item.GetEnumerator -and $item -isnot [string]) {
            @($item.GetEnumerator())
        } else {
            $item
        }
    foreach ($item in $unrolledItems) {
        $this = $_ = $psItem = $item
        if (-not $( 
    foreach ($attr in $this.ScriptBlock.Attributes) {                    
        if ($attr -is [Reflection.AssemblyMetaDataAttribute] -and  $attr.Key -eq 'GitPub.Source') { $true; break }
    } 
        )) { continue } 
        $item
    }
    
    
}
# Walk over each item in the filtered collection
foreach ($item in $filteredCollection) {
    # we set $this, $psItem, and $_ for ease-of-use.
    $this = $_ = $psItem = $item
if ($item.value -and $item.value.pstypenames.insert) {
    if ($item.value.pstypenames -notcontains 'GitPub.Sources') {
        $item.value.pstypenames.insert(0, 'GitPub.Sources')
    }
}
elseif ($item.pstypenames.insert -and $item.pstypenames -notcontains 'GitPub.Sources') {
    $item.pstypenames.insert(0, 'GitPub.Sources')
}
$item
            
}
)
    
        $publisherFunctions = 
$(
# Collect all items into an input collection
$inputCollection =$(
$executionContext.SessionState.InvokeCommand.GetCommands('*','Function',$true)
)
# 'unroll' the collection by iterating over it once.
$filteredCollection = $inputCollection =
    @(foreach ($in in $inputCollection) {
        $in
    })
# Since filtering conditions have been passed, we must filter item-by-item
$filteredCollection = :nextItem foreach ($item in $inputCollection) {
    # we set $this, $psItem, and $_ for ease-of-use.
    $this = $_ = $psItem = $item
 
    # Some of the items may be variables.
    if ($item -is [Management.Automation.PSVariable]) {
        # In this case, reassign them to their value.
        $this = $_ = $psItem = $item = $item.Value
    }
    
    # Some of the items may be enumerables
    $unrolledItems = 
        if ($item.GetEnumerator -and $item -isnot [string]) {
            @($item.GetEnumerator())
        } else {
            $item
        }
    foreach ($item in $unrolledItems) {
        $this = $_ = $psItem = $item
        if (-not $(                 
    foreach ($attr in $this.ScriptBlock.Attributes) {                    
        if ($attr -is [Reflection.AssemblyMetaDataAttribute] -and 
            ($attr.Key -eq 'GitPub.Publisher')) { $true; break }
    }
        )) { continue } 
        $item
    }
    
    
}
# Walk over each item in the filtered collection
foreach ($item in $filteredCollection) {
    # we set $this, $psItem, and $_ for ease-of-use.
    $this = $_ = $psItem = $item
if ($item.value -and $item.value.pstypenames.insert) {
    if ($item.value.pstypenames -notcontains 'GitPub.Publishers') {
        $item.value.pstypenames.insert(0, 'GitPub.Publishers')
    }
}
elseif ($item.pstypenames.insert -and $item.pstypenames -notcontains 'GitPub.Publishers') {
    $item.pstypenames.insert(0, 'GitPub.Publishers')
}
$item
            
}
)
        [PSCustomObject]@{
            PSTypeName = 'GitPub'
            Version    = $MyInvocation.MyCommand.Module.Version
            Sources    = $sourceFunctions
            Publishers = $publisherFunctions
        }
        
    }
}