functions/inheritance.ps1
<# .PARAMETER valuesOnly Inherit only value types, do not inherit dictionaries (helps prevent infinite inheritance loop) #> function inherit-properties($from, $to, $exclude = @(), [switch][bool] $valuesOnly) { if ($from -is [System.Collections.IDictionary]) { } else { $from = $from.psobject.properties | % { $d = @{} } { $d[$_.name] = $_.value } { $d } } $from = $from.getenumerator() | % { $h = @{} }{ $key = $_.key $value = $_.value $shouldExclude = $false if ($key -in $exclude) { $shouldExclude = $true } if (@($exclude | ? { $key -match "^$_$" }).Count -gt 0) { $shouldExclude = $true } if ($value -is [System.Collections.IDictionary]) { if ($valuesOnly) { $shouldExclude = $true } else { $newvalue = copy-hashtable $value $value = $newvalue } } if (!$shouldExclude) { $h[$key] = $value } } { $h } if ($from -ne $null) { $null = add-properties -object $to -props $from -merge -ifNotExists } <# foreach($key in $from.keys) { $value = $from[$key] if ($value -is [System.Collections.IDictionary]) { if ($valuesOnly) { $shouldExclude = $true } else { $value = $value.Clone() } } if (!$shouldExclude) { add-property $to -name $key -value $value } } #> } function inherit-globalsettings($proj, $settings) { if ($settings -ne $null) { write-verbose "inheriting global settings to $($proj._fullpath). strip=$stripsettingswrapper" $stripsettingswrapper = $settings._strip if ($stripsettingswrapper -ne $null -and $stripsettingswrapper) { $null = inherit-properties -from $settings -to $proj -ifNotExists -merge } else { $null = add-property $proj "settings" $settings -ifNotExists -merge } } } |