template/module/Module_classes.psm1

# Dot source classes and public/private functions. Missing or empty directories are valid.
$getScriptFiles = {
    param([Parameter(Mandatory)][string]$Directory)

    $directoryPath = Join-Path -Path $PSScriptRoot -ChildPath $Directory
    if (Test-Path -LiteralPath $directoryPath -PathType Container) {
        Get-ChildItem -LiteralPath $directoryPath -Filter '*.ps1' -File -Recurse -ErrorAction Stop |
            Sort-Object -Property FullName
    }
}

$classes = @(& $getScriptFiles -Directory 'Classes')
$public  = @(& $getScriptFiles -Directory 'Public')
$private = @(& $getScriptFiles -Directory 'Private')
foreach ($import in @($classes + $public + $private)) {
    try {
        . $import.FullName
    } catch {
        throw "Unable to dot source [$($import.FullName)]: $($_.Exception.Message)"
    }
}

Export-ModuleMember -Function $public.Basename