[CmdletBinding()]param(
    [Parameter(Position=1)]
    [string]$OutputPath,
    [Parameter(Mandatory,Position=0,ValueFromPipeline)]
    [string]$Url,
    [switch]$Force,
    [switch]$PassThru
)

process {
    $local:outputFileName=[string]::Empty
    if( -not $OutputPath ) {
        $OutputPath = Join-Path $(Get-Item $PWD) ''
    } elseif( Test-Path -Type Container $OutputPath ) {
        $OutputPath = Join-Path $(Get-Item $OutputPath) ''
    }        

    if( $OutputPath -notmatch '[/\\]$' ) {
        $outputFileName = Split-Path -Leaf $OutputPath
        $OutputPath = Join-Path $(Split-Path -Parent $OutputPath) ''
    }

    if( -not (Test-Path $OutputPath) -and $Force ) {
        New-Item -Type Directory $OutputPath
    }

    if( -not (Test-Path $OutputPath) ) { throw "Destination $OutputPath does not exists, aborting!" }

    if( -not $outputFileName ) {
        $outputFileName = Split-Path -Leaf $Url
    }

    $outputFileName = Join-Path $OutputPath $outputFileName

   if( (Test-Path $outputFileName) -and -not $Force) {
        throw "$OutputFileName file already exists"
    }

    Write-Verbose "About to start download from:`n`t$Url`n`tto`n`t$outputFileName`n"

    Invoke-WebRequest -Uri $Url -OutFile $outputFileName

    if( $PassThru ) { Get-Item $outputFileName }
}