Private/New-DMObjectReport.ps1

function New-DMObjectReport{
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')]
    [Cmdletbinding()]
    Param(
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true,Position=0,Mandatory=$true)]
        [pscustomobject]$Object,
        [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true,Position=1,Mandatory=$false)]
    [ValidateSet("lunsv3","lunsv6","hosts","hostgroups","lungroups","disks")]
        [string]$ReportType,
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true,Position=2,Mandatory=$false)]
        [xml]$ReportTemplate
    )

    # IF ReportTemplate not set, use the default one
    if ($ReportTemplate){
        [xml]$XMLFile = $ReportTemplate
    } else {
        switch ($ReportType)
        {
            lunsv3 {$defaultTemplate = $Lunsv3ReportTemplate}
            lunsv6 {$defaultTemplate = $Lunsv6ReportTemplate}
            hosts {$defaultTemplate = $HostsReportTemplate}
            hostgroups {$defaultTemplate = $HostGroupsReportTemplate}
            lungroups {$defaultTemplate = $LunGroupsReportTemplate}
            disks {$defaultTemplate = $DisksReportTemplate}
        }
        [xml]$XMLFile = Get-content -Path $defaultTemplate
    }

    $propertiesCollected = $XMLFile.SelectNodes("/$ReportType/properties/property[enabled=1]") | Sort-Object { [int] $_.order }

    $returnObject = @()

    foreach ($obj in $Object)
    {
        $objectToAdd = New-Object -TypeName PsObject
        foreach ($property in $propertiesCollected.name)
        {
            $objectToAdd | Add-Member -MemberType NoteProperty -Name $property -Value $obj.$property
        }
        $returnObject += $objectToAdd
    }

    return $returnObject
}