$script:ModuleRoot = $PSScriptRoot
$script:ModuleVersion = (Import-PowerShellDataFile -Path "$($script:ModuleRoot)\puppet.dsc.psd1").ModuleVersion

# Detect whether at some level dotsourcing was enforced
$script:doDotSource = Get-PSFConfigValue -FullName puppet.dsc.Import.DoDotSource -Fallback $false
if ($puppet.dsc_dotsourcemodule) { $script:doDotSource = $true }

  Note on Resolve-Path:
  All paths are sent through Resolve-Path/Resolve-PSFPath in order to convert them to the correct path separator.
  This allows ignoring path separators throughout the import sequence, which could otherwise cause trouble depending on OS.
  Resolve-Path can only be used for paths that already exist, Resolve-PSFPath can accept that the last leaf my not exist.
  This is important when testing for paths.

# Detect whether at some level loading individual module files, rather than the compiled module was enforced
$importIndividualFiles = Get-PSFConfigValue -FullName puppet.dsc.Import.IndividualFiles -Fallback $false
if ($puppet.dsc_importIndividualFiles) { $importIndividualFiles = $true }
if (Test-Path (Resolve-PSFPath -Path "$($script:ModuleRoot)\..\.git" -SingleItem -NewChild)) { $importIndividualFiles = $true }
if ("<was not compiled>" -eq '<was not compiled>') { $importIndividualFiles = $true }
function Import-ModuleFile
      Loads files into the module on module import.
      This helper function is used during module initialization.
      It should always be dotsourced itself, in order to proper function.
      This provides a central location to react to files being imported, if later desired
      The path to the file to load
      PS C:\> . Import-ModuleFile -File $function.FullName
      Imports the file stored in $function according to import policy

  Param (
  $resolvedPath = $ExecutionContext.SessionState.Path.GetResolvedPSPathFromPSPath($Path).ProviderPath
  if ($doDotSource) { . $resolvedPath }
  else { $ExecutionContext.InvokeCommand.InvokeScript($false, ([scriptblock]::Create([io.file]::ReadAllText($resolvedPath))), $null, $null) }

#region Load individual files
if ($importIndividualFiles)
  # Execute Preimport actions
  . Import-ModuleFile -Path "$ModuleRoot\internal\scripts\preimport.ps1"
  # Import all internal functions
  foreach ($function in (Get-ChildItem "$ModuleRoot\internal\functions" -Filter "*.ps1" -Recurse -ErrorAction Ignore))
    . Import-ModuleFile -Path $function.FullName
  # Import all public functions
  foreach ($function in (Get-ChildItem "$ModuleRoot\functions" -Filter "*.ps1" -Recurse -ErrorAction Ignore))
    . Import-ModuleFile -Path $function.FullName
  # Execute Postimport actions
  . Import-ModuleFile -Path "$ModuleRoot\internal\scripts\postimport.ps1"
  # End it here, do not load compiled code below
#endregion Load individual files

#region Load compiled code
# "<compile code into here>"
#endregion Load compiled code