imports.ps1

# grab functions from files
get-childitem $psscriptroot\functions\ -filter "*.ps1" | 
? { -not ($_.name.Contains(".Tests.")) } |
? { -not (($_.name).StartsWith("_")) } |
% { . $_.fullname }


$usenative = $true
$lib = "$psscriptroot\lib\publishmap.core.dll"

function loadLib($lib, [scriptblock] $init) {
    $libdir = split-path -parent $lib 

    $OnAssemblyResolve = [System.ResolveEventHandler] {
        param($sender, $e)
        write-warning "resolving assembly '$($e.Name)' by $sender"
        foreach($a in [System.AppDomain]::CurrentDomain.GetAssemblies()) {
            if ($a.FullName -eq $e.Name) {
                return $a
            }
            $splits = $e.Name.Split(",")
            if ($a.GetName().Name -eq $splits[0]) {
                return $a
            }
        }
        Write-Warning "failed to resolve assembly '$($e.name)'"
        return $null
    }


    foreach($asm in (get-childitem $libdir -Filter "*.dll")) {
        try {
            [System.Reflection.Assembly]::LoadFile($asm.fullname)
            #write-host "imported $($asm.Name)"
        } catch {
            write-warning "failed to import $($asm.Name): $($_.Exception.Message)"
        }
    }
    
    try {
       
  
        # [System.AppDomain]::CurrentDomain.add_AssemblyResolve($OnAssemblyResolve)
        Add-Type -Path "$lib"
        if ($init -ne $null) {
            Invoke-Command $init
        }
        #write-host "lib $lib imported"
       
    } catch {
        throw $_
    }
    finally {
        # [System.AppDomain]::CurrentDomain.remove_AssemblyResolve($OnAssemblyResolve)

    }
}

if ($usenative) {

    loadlib $lib -init { 
        [Publishmap.Utils.Inheritance.Inheritance]::Init()
    }

    function add-property {
        [CmdletBinding()]
        param(
            [Parameter(ValueFromPipeline = $true, Position=1)] $object, 
            [Parameter(Mandatory=$true,Position=2)] $name, 
            [Parameter(Mandatory=$true,Position=3)] $value, 
            [switch][bool] $ifNotExists,
            [switch][bool] $overwrite,
            [switch][bool] $merge
        )  
        # Measure-function "$($MyInvocation.MyCommand.Name)" {
        if ($object -is [System.Collections.IDictionary]) {
            $r = [Publishmap.Utils.Inheritance.Inheritance]::AddProperty($object, $name, $value, $ifNotExists, $overwrite, $merge)
        }
        else {
            $null = $object | add-member -name $name -membertype noteproperty -value $value
        }
        
        return $object
        # }
    }

    
    function add-properties(
        [Parameter(Mandatory=$true, ValueFromPipeline = $true)] 
        $object,
        [Parameter(Mandatory=$true)]
        $props, 
        [switch][bool] $ifNotExists, 
        [switch][bool] $merge, 
        $exclude = @()
    ) {
        # Measure-function "$($MyInvocation.MyCommand.Name)" {
        $r = [Publishmap.Utils.Inheritance.Inheritance]::AddProperties($object, $props, $ifNotExists, $merge, $exclude)
        return $object
        # }
    }


    function add-metaproperties {
        param($group, $fullpath, $specialkeys = @("settings", "global_prof1iles"))
        #Measure-function "$($MyInvocation.MyCommand.Name)" {
        [Publishmap.Utils.Inheritance.Inheritance]::AddMetaProperties($group, $fullpath, $specialkeys)      
        return $group      
        # }
    }



    function copy-hashtable($hash) {
        # Measure-function "$($MyInvocation.MyCommand.Name)" {
        return [Publishmap.Utils.Inheritance.Inheritance]::CopyHashtable($hash)
        # }
    }

    function Add-InheritedProperties($from, $to, $exclude = @(), [switch][bool] $valuesOnly) {
        # Measure-function "$($MyInvocation.MyCommand.Name)" {
        $r = [Publishmap.Utils.Inheritance.Inheritance]::AddInheritedProperties($from, $to, @($exclude), $valuesOnly)
       
        # }
    }

    function postprocess-publishmap($map) {    
        # Measure-function "$($MyInvocation.MyCommand.Name)" {
        [Publishmap.Utils.Inheritance.Inheritance]::PostProcessPublishmap($map)
        return $map
        # }
    }

    function Add-GlobalSettings($proj, $settings) {
        # Measure-function "$($MyInvocation.MyCommand.Name)" {
        [Publishmap.Utils.Inheritance.Inheritance]::AddGlobalSettings($proj, $settings)
        # }
    }

    function import-genericgroup($group,
        $fullpath, 
        $settings = $null,
        $settingskey = "settings",
        $specialkeys = @("settings", "global_profiles")
    ) {
        # Measure-function "$($MyInvocation.MyCommand.Name)" {
        $g = [Publishmap.Utils.Inheritance.Inheritance]::ImportGenericGroup($group, $fullpath, $settings, $settingskey, $specialkeys)
        return $g
        # }
    }
}