Import-Carbon.ps1

<#
.SYNOPSIS
Imports the Carbon module.
 
.DESCRIPTION
Intelligently imports the Carbon module, re-importing it if needed. Carbon will be re-imported if:
 
 * a different version is currently loaded
 * any of Carbon's files were modified since it was last imported with this script
 * the `Force` switch is set
 
.EXAMPLE
Import-Carbon.ps1
 
Imports the Carbon module, re-loading it if its already loaded.
#>


# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

[CmdletBinding(SupportsShouldProcess=$true)]
param(
    # The prefix to use on all the module's functions, cmdlets, etc.
    [string]$Prefix,

    # Reload the module no matter what.
    [Switch]$Force
)

#Requires -Version 4
Set-StrictMode -Version 'Latest'

$carbonPsd1Path = Join-Path -Path $PSScriptRoot -ChildPath 'Carbon.psd1' -Resolve

& {
    $originalVerbosePref = $Global:VerbosePreference
    $originalWhatIfPref = $Global:WhatIfPreference

    $Global:VerbosePreference = $VerbosePreference = 'SilentlyContinue'
    $Global:WhatIfPreference = $WhatIfPreference = $false

    try
    {
        $module = Get-Module -Name 'Carbon'
        if( $module )
        {
            $expectedPath = Join-Path -Path $PSScriptRoot -ChildPath 'Carbon.psm1'
            if( $Force -or $module.Path -ne $expectedPath )
            {
                Remove-Module -Name 'Carbon' -Force
            } 
        }

        $optionalParams = @{ }
        if( $Prefix )
        {
            $optionalParams['Prefix'] = $Prefix
        }

        Import-Module -Name $carbonPsd1Path @optionalParams
    }
    finally
    {
        $Global:VerbosePreference = $originalVerbosePref
        $Global:WhatIfPreference = $originalWhatIfPref
    }
}