PowerShell Object Prototype Builder
PowerShell C# Shell
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
nuget
src
.gitattributes
.gitignore
LICENSE.txt
NuGetPackageBuilder.cmd
README.md
RunTests.cmd
RunTests.ps1
init.ps1

README.md

prototype.ps

Prototype.ps provides domain specific language enhancements to PowerShell creating prototypal objects.

An simple example:

function New-SapiVoice {
  $prototype = New-Prototype
  $prototype | Update-TypeName
  $prototype | New-Function say {
    param([string]$message)
    $speaker = new-object -com SAPI.SpVoice
    ($speaker.Speak($message, 1)) | out-null
  }

  # Add a new property to this prototype
  $prototype | New-Property Message1 "This is Message 1"
  $prototype | New-ScriptProperty Message2 {"This is Message 2"}
  
  # Add a proxy property to this prototype
  $prototype | New-ScriptProperty Message3 {$this.Message1} {param([String]$value); $this.Message1 = $value}
  
  # always return the base prototype
  $prototype
}

$voice = New-SapiVoice
$voice.say($voice.Message1)

Inheritance:

function new-circle {
  param($radius = 3)
  $prototype = New-Prototype
  $prototype | Update-TypeName
  $prototype | New-Property Pi 3.14159 Readonly
  $prototype | New-Property Radius $radius
  $prototype | New-ScriptProperty Diameter {$this.Radius * 2}
  $prototype | New-ScriptProperty Circumference {$this.Diameter * $this.Pi}
  $prototype | New-ScriptProperty Area {$this.Radius * $this.Radius * $this.Pi}
  $prototype
}

function new-cylinder {
  param($radius = 3, $height = 4)
  $prototype = new-circle($radius)
  $prototype | Update-TypeName
  $prototype | New-Property Height $height
  $prototype | New-ScriptProperty LateralArea {$this.Radius * $this.Radius * $this.Pi}
  # override/replace Area
  $prototype | New-ScriptProperty Area {2 * $this.LateralArea + 2 * $this.Pi * $this.Radius * $this.Height}
  $prototype
}

$cylinder = new-cylinder -radius 5.0 -height 4.0
$cylinder.Radius
$cylinder.Diameter
$cylinder.Height
$cylinder.Circumference
$cylinder.LateralArea
$cylinder.Area

See the examples folder for more usages and tips.