TypeClass/src/TypeClass.psm1

function Test-Value ($Value) {
    $Value = $($Value)
    $Value -is [ValueType] -or $Value -is [string] -or $value -is [scriptblock]
}

function Test-Collection ($Value) { 
    $Value -is [Array] -or $Value -is [Collections.IEnumerable]
}

function Test-ScriptBlock ($Value) {
    $Value -is [ScriptBlock]
}

function Test-DecimalNumber ($Value) { 
    $Value -is [float] -or $Value -is [single] -or $Value -is [double] -or $Value -is [decimal]
}

function Test-Hashtable ($Value) { 
    $Value -is [hashtable] 
}

function Test-Dictionary ($Value) { 
    $Value -is [System.Collections.IDictionary] 
}


function Test-Object ($Value) {
    # here we need to approximate that that object is not value
    # or any special category of object, so other checks might
    #need to be added (such as for hashtables)

    -not ($null -eq $Value -or (Test-Value -Value $Value) -or (Test-Collection -Value $Value))
}

Export-ModuleMember -Function @( 
    'Test-Value'
    'Test-Collection'
    'Test-ScriptBlock'
    'Test-DecimalNumber'
    'Test-Hashtable'
    'Test-Dictionary'
    'Test-Object'
)