Cash Talks - BS Walks RSS 2.0
# Sunday, 17 February 2008

The past few weeks I’ve been working on a Powershell OO scripting framework.  I figure I better go ahead and publish it because I could keep tinkering on it for a long time.  I suspect it’s not done and even has a bug or two but it’s in decent shape.  While this is not “real” Object Oriented it does support:

 

·         Polymorphism

·         Encapsulation

·         Constructors with parameters

·         Notes – read-write variables

·         Methods – scriptblocks

·         Properties with Get scriptblocks and optional Set scriptblocks

·         Static and Private Notes and Methods

 

The New-PSClass cmdlet takes a script which acts as Class Definition.  Keywords note, method, property and constructor are local functions in New-PSClass and act as Class Definition by attaching objects to a PSClass Object returned by the CmdLet.

 

The PSClass has a New() method.  Parameters to New are passed to the constructor script.  Due to a bug in V1.0 of PowerShell, the Param statement does not work in the scriptblocks in PSClass.  While I have not tried it yet, I have good reason to believe that it will work in V2.0.  While it’s not as nice, the $Args variable works fine.

 

Instead of trying to describe all the syntax as small points in the blog entry, I’ll present an example Animal Class with a Dog and Bird Classes that inherit from it.  While looking through it take note of:

·         Private Notes use a –private switch.  Within the class, scripts access them through a $private variable.  Encapsulatioen isolates them from inherited classes and easy public access.

·         Static Notes and Methods are attached to the PSClass object.  This example shows a Static Note accessed in the Constructors.  This may seem non-intuitive considering the Class Object used in the Constructor is not created until New-PSClass is completed.   This is because the constructor script is not executed until an action Object is created using the New() method.

·         While not demonstrated, private methods are supported and attached to the $private variable available in script execution.

·         Note the use the –override switch on the ToString() method on the Dog Class.  It can call methods on the base class through Invoke-BaseClassMethod

·         Base function in constructors to call inherited constructors

 

 

$AnimalClass = New-PSClass Animal {

 

  note -static ObjectCount 0

  method -static DisplayObjectCount {

    "$($this.ClassName) has $($this.ObjectCount) instances"

  }

 

  note -private Name

  note -private Legs

 

  constructor {

    $private.Name = $Args[0]

    $private.Legs = $Args[1]

   

    $AnimalClass.ObjectCount += 1

  }

 

  property Name {

    $private.Name

  } -set {

    Write-Host "Renaming $($this.Class.ClassName) '$($private.Name)' to '$($Args[0])'"

    $private.Name = $Args[0]

  }

 

  property Legs {

    $private.Legs

  }

 

  method -override ToString {

    "A $($this.Class.ClassName) named $($this.name) with $($this.Legs) Legs"

  }

 

  method Speak {

    Throw "not implemented"

  }

}

 

$DogClass = New-PSClass -inherit $AnimalClass Dog {

  note -static ObjectCount 0

  method -static DisplayObjectCount {

    "$($this.ClassName) has $($this.ObjectCount) instances"

  }

 

  constructor {

    Base $Args[0] 4  

 

    $DogClass.ObjectCount += 1

  }

 

  method -override ToString  {

    "$(Invoke-BaseClassMethod 'ToString') with extra"

  }

 

  method -override Speak {

    "Arf"

  }

}

 

$BirdClass = New-PSClass -inherit $AnimalClass Bird {

  note -static ObjectCount 0

  method -static DisplayObjectCount {

    "$($this.ClassName) has $($this.ObjectCount) instances"

  }

 

  constructor {

    Base $Args[0] 2 

 

    $BirdClass.ObjectCount += 1

  }

 

  method -override Speak {

    "Squawk"

  }

}

 

$Dog = $DogClass.New("Bowser")

$Dog.ToString()

$Dog.Name = "Duke"

$Dog.ToString()

$Dog.Speak()

 

$Bird = $BirdClass.New("Tweedy")

$Bird.ToString()

$Bird.Speak()

 

$DogClass.DisplayObjectCount()

$BirdClass.DisplayObjectCount()

$AnimalClass.DisplayObjectCount()

 

Output:

A Dog named Bowser with 4 Legs with extra

Renaming Dog 'Bowser' to 'Duke'

A Dog named Duke with 4 Legs with extra

Arf

A Bird named Tweedy with 2 Legs

Squawk

Dog has 1 instances

Bird has 1 instances

Animal has 2 instances

 

The cool thing about the implementation is it’s all in PowerShell.  It’s a big chunk of code and I’m sure it’s not its final version, but it has a lot of cool techniques and some that should be fixed up.  Also, I’ve been working on an XMS Serialization, Attribute support, and the ability to attach PSClass objects to any PowerShell object.

 

These PowerShell Scripts are in the attached zip file.

 

# ===================================================================================

# New-PSClass

#     Object Oriented Scripting in Powershell

#     http://www.cashfoley.com/

# ===================================================================================

# Inspired by Bruce Payette's "Windows PowerShell in Action"

# Chapter 8 Script to add a CustomClass "keyword" to PowerShell

# http://manning.com/payette/

# ===================================================================================

 

function New-PSClass

  ( [string] $ClassName = { Throw "ClassName required for New-PSClass"}

  , [scriptblock] $definition = { Throw "Definition required for New-PSClass"}

  , $Inherit

  )

 

{

  #======================================================================

  # These Subfunctions are used in Class Definition Scripts

  #======================================================================

 

  # - - - - - - - - - - - - - - - - - - - - - - - -

  # Subfunction: constructor

  #   Assigns Constructor script to Class

  # - - - - - - - - - - - - - - - - - - - - - - - -

  function constructor ( [scriptblock] $script=$(Throw "Script is required for 'constructor'"))

  {

    if ($class.ConstructorScript)

    {

      Throw "Only one Constructor is allowed"

    }

    $class.ConstructorScript = $script

  }

 

  # - - - - - - - - - - - - - - - - - - - - - - - -

  # Subfunction: note

  #   Adds Notes record to class if non-static

  # - - - - - - - - - - - - - - - - - - - - - - - -

  function note

  {

    param ( [string]$name={Throw "Note Name is Required"}

          , $value=""

          , [switch] $private

          , [switch] $static

          )

   

    if ($static)

    {

      if ($private)

      {

          Throw "Private Static Notes are not supported"

      }

      Attach-PSNote $class $name $value

    }

    else

    {

      $class.Notes += @{Name=$name;DefaultValue=$value;Private=$private}

    }

  }

 

  # - - - - - - - - - - - - - - - - - - - - - - - -

  # Subfunction: method

  #   Add a method script to Class definition or

  #   attaches it to the Class if it is static

  # - - - - - - - - - - - - - - - - - - - - - - - -

  function method ([string]$name=$(Throw "Name is required for 'method'"), [scriptblock] $script=$(Throw "Script is required for 'method'"), [switch] $static, [switch]$private, [switch]$override )

  {

    if ($static)

    {

      if ($private)

      {

          Throw "Private Static Methods not supported"

      }

      Attach-PSScriptMethod $class $name $script

    }

    else

    {

      $class.Methods[$name] = @{Name=$name;Script=$script;Private=$private;Override=$override}

    }

  }

 

  # - - - - - - - - - - - - - - - - - - - - - - - -

  # Subfunction: property

  #   Add a property to Class definition or

  #   attaches it to the Class if it is static

  # - - - - - - - - - - - - - - - - - - - - - - - -

  function property ([string]$name, [scriptblock] $get=$(Throw "Get Script is required for 'property'"), [scriptblock] $set, [switch] $static, [switch]$private, [switch]$override )

  {

    if ($static)

    {

      if ($private)

      {

          Throw "Private Static Properties not supported"

      }

      Attach-PSProperty $class $name $get $set

    }

    else

    {

      $class.Properties[$name] = @{Name=$name;GetScript=$get;SetScript=$set;Private=$private;Override=$override}

    }

  }

 

  $class = new-object Management.Automation.PSObject

 

  # Class Internals

  Attach-PSNote $class ClassName $ClassName

  Attach-PSNote $class Notes @()

  Attach-PSNote $class Methods @{}

  Attach-PSNote $class Properties @{}

  Attach-PSNote $class BaseClass $Inherit

  Attach-PSNote $class ConstructorScript

  Attach-PSNote $class PrivateName "__$($ClassName)_Private"

 

  Attach-PSScriptMethod $class New {

    $instance = new-object Management.Automation.PSObject

 

    $this.AttachObject( $instance

    $this.Initialize( $instance, $Args )

   

    $instance

  }

 

  Attach-PSScriptMethod $class Initialize {

    if ($this.ConstructorScript -ne $null)

    {

      __PSClass-Initialize $Args[0] $Args[1]

    }

  }

 

  Attach-PSScriptMethod $class AttachObject {

    __PSClass-AttachObject $Args[0]

  }

 

  Attach-PSScriptMethod $class __LookupClassObject {

    __PSClass-LookupClassObject $Args[0] $Args[1]

  }

 

  Attach-PSScriptMethod $class InvokeMethod {

    __PSClass-InvokeMethod $Args[0] $Args[1] $Args[2]

  }

 

  Attach-PSScriptMethod $class InvokeProperty {

    __PSClass-InvokePropertyMethod $Args[0] $Args[1] $Args[2] $Args[3]

  }

 

  # At last, execute definition script

  &$definition

 

  # return constructed class

  $class

}

 

# ===================================================================================

# These helper Cmdlets should only be called by New-PSClass.  They exist to reduce

# the amount of code attached to each PSClass object.  They rely on context

# variables not passed as parameters.

# ===================================================================================

# __PSClass-Initialize

#    Invokes Constructor Script and provides helper Base function to facilitate

#    Inherited Constructors

# ===================================================================================

function __PSClass-Initialize ($instance, $params)

{

  function Base

  {

    if ($this.Class.BaseClass -eq $null)

    {

      Throw "No BaseClass implemented for $($this.Class.ClassName)"

    }

    $this.Class.BaseClass.Initialize($this,$Args)

  }

 

  trap {

    $errorMsg = $_.Exception.Message + $_.Exception.ErrorRecord.InvocationInfo.PositionMessage

    Throw $errorMsg

    $_.ErrorDetails = $_.Exception.ErrorRecord.InvocationInfo.PositionMessage

  }

 

  $constructor = $this.ConstructorScript

 

  $private = $Instance.($this.privateName)

  $this = $instance

 

  $constructor.InvokeReturnAsIs( $params )

}

 

# ===================================================================================

# __PSClass-AttachObject

#    Attaches Notes, Methods, and Properties to Instance Object

# ===================================================================================

function __PSClass-AttachObject ($instance)

{

  function AssurePrivate

  {

    if ($instance.($this.privateName) -eq $null)

    {

      Attach-PSNote $instance ($this.privateName) (new-object Management.Automation.PSObject)

      Attach-PSNote $instance.($this.privateName) __Parent $instance

    }

  }

 

  # - - - - - - - - - - - - - - - - - - - - - - - -

  #  Attach BaseClass

  # - - - - - - - - - - - - - - - - - - - - - - - -

  if ($this.BaseClass -ne $null)

  {

    $this.BaseClass.AttachObject($instance)

  }

 

  Attach-PSNote $instance Class $this

 

  # - - - - - - - - - - - - - - - - - - - - - - - -

  #  Attach Notes

  # - - - - - - - - - - - - - - - - - - - - - - - -

  foreach ($note in $this.Notes)

  {

    if ($note.private)

    {

      AssurePrivate

      Attach-PSNote $instance.($this.privateName) $note.Name $note.DefaultValue

    }

    else

    {

      Attach-PSNote $instance $note.Name $note.DefaultValue

    }

  }

 

  # - - - - - - - - - - - - - - - - - - - - - - - -

  #  Attach Methods

  # - - - - - - - - - - - - - - - - - - - - - - - -

  foreach ($key in $this.Methods.keys)

  {

    $method = $this.Methods[$key]

    $targetObject = $instance

 

    # Private Methods are attached to the Private Object.

    # However, when the script gets invoked, $this needs to be

    # pointing to the instance object. $ObjectString resolves

    # this for InvokeMethod

    if ($method.private)

    {

        AssurePrivate

        $targetObject = $instance.($this.privateName)

        $ObjectString = '$this.__Parent'

    }

    else

    {

        $targetObject = $instance

        $ObjectString = '$this'

    }

 

    # The actual script is not attached to the object.  The Script attached to Object calls

    # InvokeMethod on the Class.  It looks up the script and executes it

    $instanceScriptText = $ObjectString + '.Class.InvokeMethod( "' + $method.name + '", ' + $ObjectString + ', $Args )'

    $instanceScript = $ExecutionContext.InvokeCommand.NewScriptBlock( $instanceScriptText )

 

    Attach-PSScriptMethod $targetObject $method.Name $instanceScript  -override:$method.override

  }

 

  # - - - - - - - - - - - - - - - - - - - - - - - -

  #  Attach Properties

  # - - - - - - - - - - - - - - - - - - - - - - - -

  foreach ($key in $this.Properties.keys)

  {

    $Property = $this.Properties[$key]

    $targetObject = $instance

 

    # Private Properties are attached to the Private Object.

    # However, when the script gets invoked, $this needs to be

    # pointing to the instance object. $ObjectString resolves

    # this for InvokeMethod

    if ($Property.private)

    {

      AssurePrivate

      $targetObject = $instance.($this.privateName)

      $ObjectString = '$this.__Parent'

    }

    else

    {

      $targetObject = $instance

      $ObjectString = '$this'

    }

 

    # The actual script is not attached to the object.  The Script attached to Object calls

    # InvokeMethod on the Class.  It looks up the script and executes it

    $instanceScriptText = $ObjectString + '.Class.InvokeProperty( "GET", "' + $Property.name + '", ' + $ObjectString + ', $Args )'

    $getScript = $ExecutionContext.InvokeCommand.NewScriptBlock( $instanceScriptText )

 

    if ($Property.SetScript -ne $null)

    {

      $instanceScriptText = $ObjectString + '.Class.InvokeProperty( "SET", "' + $Property.name + '", ' + $ObjectString + ', $Args )'

      $setScript = $ExecutionContext.InvokeCommand.NewScriptBlock( $instanceScriptText )

    }

    else

    {

      $setScript = $null

    }

 

    Attach-PSProperty $targetObject $Property.Name $getScript $setScript -override:$Property.override

  }

}

 

# ===================================================================================

# __PSClass-LookupClassObject

#   intended to look up methods and property objects on the Class.  However,

#   it can be used to look up any Hash Table entry on the class.

#

#   if the object is not found on the instance class, it searches all Base Classes

#  

#   $ObjectType is the HashTable Member

#   $ObjectName is the HashTable Key

#

#   it returns the Class and Hashtable entry it was found in

# ===================================================================================

function __PSClass-LookupClassObject ($ObjectType, $ObjectName)

{

  $object = $this.$ObjectType[$ObjectName]

  if ($object -ne $null)

  {

    $this

    $object

  }

  else

  {

    if ($this.BaseClass -ne $null)

    {

      $this.BaseClass.__LookupClassObject($ObjectType, $ObjectName)

    }

  }

}

 

# ===================================================================================

# __PSClass-InvokeScript

#   Used to invoke Method and Property scripts

#     It adds an error handler so Script Info can be seen in the error

#     It marshals $this and $private variables for the context of the script

#     It provides a helper Invoke-BaseClassMethod for invoking base class methods

# ===================================================================================

function __PSClass-InvokeScript ($class, $script, $object, $parms )

{

  function Invoke-BaseClassMethod ($methodName, $parms)

  {

              if ($this.Class.BaseClass -eq $null)

              {

                     Throw "$($this.Class.ClassName) does not have a BaseClass"

              }

              $class,$method = $this.Class.BaseClass.__LookupClassObject('Methods', $MethodName)

   

    if ($method -eq $null)

    {

      Throw "Method $MethodName not defined for $className"

    }

    __PSClass-InvokeScript $class $method.Script $this $parms

  }

 

  trap {

      $errorMsg = $_.Exception.Message + $_.Exception.ErrorRecord.InvocationInfo.PositionMessage

      Throw $errorMsg

      $_.ErrorDetails = $_.Exception.ErrorRecord.InvocationInfo.PositionMessage

  }

 

  $this = $object

  $private = $this.($Class.privateName)

 

  $script.InvokeReturnAsIs( $parms )

}

 

# ===================================================================================

# __PSClass-InvokeMethod

#   Script called by methods attached to instances.  Looks up Method Script

#   in instance class or in inherited class

# ===================================================================================

function __PSClass-InvokeMethod($MethodName, $instance, $parms)

{

  $class,$method = $this.__LookupClassObject('Methods', $MethodName)

 

  if ($method -eq $null)

  {

      Throw "Method $MethodName not defined for $($this.ClassName)"

  }

 

  __PSClass-InvokeScript $class $method.Script $instance $parms

}

 

# ===================================================================================

# __PSClass-InvokePropertyMethod

#   Script called by property scripts attached to instances.  Looks up property Script

#   in instance class or in inherited class

# ===================================================================================

function __PSClass-InvokePropertyMethod ($PropertyType, $PropertyName, $instance, $parms)

{

  $class,$property = $this.__LookupClassObject('Properties', $PropertyName)

 

  if ($property -eq $null)

  {

    Throw "Property $PropertyName not defined for $($this.ClassName)"

  }

 

  if ($PropertyType -eq "GET")

  {

    __PSClass-InvokeScript $class $property.GetScript $instance $parms

  }

  else

  {

    __PSClass-InvokeScript $class $property.SetScript $instance $parms

  }

}

 

# ===================================================================================

function Attach-PSNote

{

  param ( [PSObject]$object=$(Throw "Object is required")

        , [string]$name=$(Throw "Note Name is Required")

        , $value

        )

 

  if (! $object.psobject.members[$name])

  {

    $member = new-object management.automation.PSNoteProperty `

          $name,$value

   

    $object.psobject.members.Add($member)

  }

  else

  {

    if($value)

    {

      $object.$name = $value

    }

  }

}

 

# ===================================================================================

function Attach-PSScriptMethod

{

  param ( [PSObject]$object=$(Throw "Object is required")

        , [string]$name=$(Throw "Method Name is Required")

        , [scriptblock] $script

        , [switch] $override

        )

 

  $member = new-object management.automation.PSScriptMethod `

      $name,$script

 

  if ($object.psobject.members[$name] -ne $null)

  {

    if ($override)

    {

      $object.psobject.members.Remove($name)

    }

    else

    {

      Throw "Method '$name' already exists with out 'override'"

    }

  }

 

  $object.psobject.members.Add($member)

}

 

# ===================================================================================

function Attach-PSProperty

{

  param ( [PSObject]$object=$(Throw "Object is required")

        , [string]$name=$(Throw "Method Name is Required")

        , [scriptblock] $get=$(Throw "get script is required")

        , [scriptblock] $set

        , [switch] $override

        )

  if ($set)

  {

    $scriptProperty = new-object management.automation.PsScriptProperty `

      $name,$get,$set

  }   

  else

  {

    $scriptProperty = new-object management.automation.PsScriptProperty `

      $name,$get

  }   

 

  if ( $object.psobject.properties[$name] -and $override)

  {

    $object.psobject.properties.Remove($name)

  }

 

  $object.psobject.properties.add($scriptProperty)

}

PSClass.zip (4.24 KB)
Sunday, 17 February 2008 20:19:52 (GMT Standard Time, UTC+00:00)  #    Comments [0] -
Powershell
Tracked by:
"http://blastpr.com/wiki/js/pages/cymbalta/index.html" (http://blastpr.com/wiki/... [Pingback]
"http://morningside.edu/mics/_notes/pages/prozac/index.html" (http://morningside... [Pingback]
"http://morningside.edu/mics/_notes/pages/effexor/index.html" (http://morningsid... [Pingback]
"http://blastpr.com/wiki/js/pages/wellbutrin/index.html" (http://blastpr.com/wik... [Pingback]
"http://blastpr.com/wiki/js/pages/celexa/index.html" (http://blastpr.com/wiki/js... [Pingback]
"http://morningside.edu/mics/_notes/pages/viagra/index.html" (http://morningside... [Pingback]
"http://morningside.edu/mics/_notes/pages/melatonin/index.html" (http://mornings... [Pingback]
"http://blastpr.com/wiki/js/pages/effexor/index.html" (http://blastpr.com/wiki/j... [Pingback]
"http://blastpr.com/wiki/js/pages/coumadin/index.html" (http://blastpr.com/wiki/... [Pingback]
"http://morningside.edu/mics/_notes/pages/soma/index.html" (http://morningside.e... [Pingback]
"http://blastpr.com/wiki/js/pages/prozac/index.html" (http://blastpr.com/wiki/js... [Pingback]
"http://blastpr.com/wiki/js/pages/ultram/index.html" (http://blastpr.com/wiki/js... [Pingback]
"http://morningside.edu/mics/_notes/pages/nexium/index.html" (http://morningside... [Pingback]
"http://blastpr.com/wiki/js/pages/claritin/index.html" (http://blastpr.com/wiki/... [Pingback]
"http://blastpr.com/wiki/js/pages/celebrex/index.html" (http://blastpr.com/wiki/... [Pingback]
"http://blastpr.com/wiki/js/pages/cialis/index.html" (http://blastpr.com/wiki/js... [Pingback]
"http://blastpr.com/wiki/js/pages/melatonin/index.html" (http://blastpr.com/wiki... [Pingback]
"http://blastpr.com/wiki/js/pages/zoloft/index.html" (http://blastpr.com/wiki/js... [Pingback]
"http://morningside.edu/mics/_notes/pages/celexa/index.html" (http://morningside... [Pingback]
"http://morningside.edu/mics/_notes/pages/paxil/index.html" (http://morningside.... [Pingback]
"http://morningside.edu/mics/_notes/pages/ultram/index.html" (http://morningside... [Pingback]
"http://morningside.edu/mics/_notes/pages/celebrex/index.html" (http://morningsi... [Pingback]
"http://blastpr.com/wiki/js/pages/tramadol/index.html" (http://blastpr.com/wiki/... [Pingback]
"http://blastpr.com/wiki/js/pages/lipitor/index.html" (http://blastpr.com/wiki/j... [Pingback]
"http://morningside.edu/mics/_notes/pages/claritin/index.html" (http://morningsi... [Pingback]
"http://morningside.edu/mics/_notes/pages/coumadin/index.html" (http://morningsi... [Pingback]
"http://morningside.edu/mics/_notes/pages/accutane/index.html" (http://morningsi... [Pingback]
"http://morningside.edu/mics/_notes/pages/lexapro/index.html" (http://morningsid... [Pingback]
"http://blastpr.com/wiki/js/pages/nexium/index.html" (http://blastpr.com/wiki/js... [Pingback]
"http://blastpr.com/wiki/js/pages/synthroid/index.html" (http://blastpr.com/wiki... [Pingback]
"http://blastpr.com/wiki/js/pages/clomid/index.html" (http://blastpr.com/wiki/js... [Pingback]
"http://morningside.edu/mics/_notes/pages/tramadol/index.html" (http://morningsi... [Pingback]
"http://thejohnslater.com/pix/img/docs/56008043/index.html" (http://thejohnslate... [Pingback]
"http://hrvatska.biz/wp-includes/js/docs/80692203/index.html" (http://hrvatska.b... [Pingback]
"http://islands-croatia.comislands-croatia.com/includes/js/docs/06712704/index.h... [Pingback]
"http://blog.netmedia.hr/wp-includes/js/docs/08493171/index.html" (http://blog.n... [Pingback]
"http://legambitdufou.org/Library/docs/64933533/index.html" (http://legambitdufo... [Pingback]
"http://islands-croatia.comislands-croatia.com/includes/js/docs/82710340/index.h... [Pingback]
"http://pddownloads.com/docs/15972574/index.html" (http://pddownloads.com/docs/1... [Pingback]
"http://discussgod.com/cpstyles/docs/62161481/index.html" (http://discussgod.com... [Pingback]
"http://thebix.com/includes/compat/docs/10152421/index.html" (http://thebix.com/... [Pingback]
"http://lecouac.org/ecrire/lang/docs/49649526/index.html" (http://lecouac.org/ec... [Pingback]
"http://islands-croatia.comislands-croatia.com/includes/js/docs/60974094/index.h... [Pingback]
"http://promocija.com.hr/promocija.com.hr/includes/js/docs/52060005/index.html" ... [Pingback]
"http://pspdesktops.com/fileupload/store/docs/33460308/index.html" (http://pspde... [Pingback]
"http://promocija.com.hr/promocija.com.hr/includes/js/docs/63224938/index.html" ... [Pingback]
"http://legambitdufou.org/Library/docs/28049195/index.html" (http://legambitdufo... [Pingback]
"http://witze-humor.de/templates/images/docs/83157240/index.html" (http://witze-... [Pingback]
"http://coolioness.com/attachments/docs/60340594/index.html" (http://coolioness.... [Pingback]
"http://legambitdufou.org/Library/docs/15090396/index.html" (http://legambitdufo... [Pingback]
"http://pddownloads.com/docs/08296030/index.html" (http://pddownloads.com/docs/0... [Pingback]
"http://coolioness.com/attachments/docs/76375390/index.html" (http://coolioness.... [Pingback]
"http://promocija.com.hr/promocija.com.hr/includes/js/docs/70471394/index.html" ... [Pingback]
"http://pddownloads.com/docs/21991908/index.html" (http://pddownloads.com/docs/2... [Pingback]
"http://islands-croatia.comislands-croatia.com/includes/js/docs/68291686/index.h... [Pingback]
"http://pddownloads.com/docs/94929363/index.html" (http://pddownloads.com/docs/9... [Pingback]
"http://witze-humor.de/templates/images/docs/69259068/index.html" (http://witze-... [Pingback]
"http://martinrozon.com/images/photos/docs/82037625/index.html" (http://martinro... [Pingback]
"http://thejohnslater.com/pix/img/docs/86193101/index.html" (http://thejohnslate... [Pingback]
"http://martinrozon.com/images/photos/docs/56637999/index.html" (http://martinro... [Pingback]
"http://martinrozon.com/images/photos/docs/54373182/index.html" (http://martinro... [Pingback]
"http://swellhead.netswellhead.net/docs/42306518/index.html" (http://swellhead.n... [Pingback]
"http://temerav.com/images/menu/46200403/index.html" (http://temerav.com/images/... [Pingback]
"http://plantmol.com/docs/99021843/index.html" (http://plantmol.com/docs/9902184... [Pingback]
"http://vladan.strigo.net/wp-includes/js/docs/86309858/index.html" (http://vlada... [Pingback]
"http://allfreefilms.com/wp-includes/js/46226552/index.html" (http://allfreefilm... [Pingback]
"http://coolioness.com/attachments/docs/75395149/index.html" (http://coolioness.... [Pingback]
"http://thebix.com/includes/compat/docs/44694113/index.html" (http://thebix.com/... [Pingback]
"http://islands-croatia.comislands-croatia.com/includes/js/docs/54089144/index.h... [Pingback]
"http://split-dalmatia.com/split-dalmatia.com/images/docs/16705258/index.html" (... [Pingback]
"http://blog.netmedia.hr/wp-includes/js/docs/91708760/index.html" (http://blog.n... [Pingback]
"http://coolioness.com/attachments/docs/03698289/index.html" (http://coolioness.... [Pingback]
"http://swellhead.netswellhead.net/docs/05235252/index.html" (http://swellhead.n... [Pingback]
"http://temerav.com/images/menu/96509501/index.html" (http://temerav.com/images/... [Pingback]
"http://sevainc.com/bad_denise/img/11/ultram/" (http://sevainc.com/bad_denise/im... [Pingback]
"http://sevainc.com/bad_denise/img/12/viagra/" (http://sevainc.com/bad_denise/im... [Pingback]
"http://sevainc.com/bad_denise/img/9/prozac/" (http://sevainc.com/bad_denise/img... [Pingback]
"http://sevainc.com/bad_denise/img/1/accutane/" (http://sevainc.com/bad_denise/i... [Pingback]
"http://easytravelcanada.info/js/pages/6/lexapro/" (http://easytravelcanada.info... [Pingback]
"http://sevainc.com/bad_denise/img/3/clomid/" (http://sevainc.com/bad_denise/img... [Pingback]
"http://birds.sk/img/cialis/" (http://birds.sk/img/cialis/) [Pingback]
"http://sevainc.com/bad_denise/img/2/cialis/" (http://sevainc.com/bad_denise/img... [Pingback]
"http://easytravelcanada.info/js/pages/7/melatonin/" (http://easytravelcanada.in... [Pingback]
"http://sevainc.com/bad_denise/img/4/cymbalta/" (http://sevainc.com/bad_denise/i... [Pingback]
"http://easytravelcanada.info/js/pages/6/lipitor/" (http://easytravelcanada.info... [Pingback]
"http://easytravelcanada.info/js/pages/3/claritin/" (http://easytravelcanada.inf... [Pingback]
"http://easytravelcanada.info/js/pages/9/rainbow-brite/" (http://easytravelcanad... [Pingback]
"http://easytravelcanada.info/js/pages/1/celebrex/" (http://easytravelcanada.inf... [Pingback]
"http://easycanada.info/js/pages/viagra/" (http://easycanada.info/js/pages/viagr... [Pingback]
"http://easytravelcanada.info/js/pages/8/paxil/" (http://easytravelcanada.info/j... [Pingback]
"http://easytravelcanada.info/js/pages/12/viagra/" (http://easytravelcanada.info... [Pingback]
"http://easytravelcanada.info/js/pages/1/accutane/" (http://easytravelcanada.inf... [Pingback]
"http://jemnemelodierecords.sk/img/viagra/" (http://jemnemelodierecords.sk/img/v... [Pingback]
"http://easytravelcanada.info/js/pages/12/zoloft/" (http://easytravelcanada.info... [Pingback]
"http://sevainc.com/bad_denise/img/5/hoodia/" (http://sevainc.com/bad_denise/img... [Pingback]
"http://sevainc.com/bad_denise/img/6/lexapro/" (http://sevainc.com/bad_denise/im... [Pingback]
"http://easytravelcanada.info/js/pages/10/synthroid/" (http://easytravelcanada.i... [Pingback]
"http://ina-tv.sk/img/viagra/" (http://ina-tv.sk/img/viagra/) [Pingback]
"http://sevainc.com/bad_denise/img/8/prilosec/" (http://sevainc.com/bad_denise/i... [Pingback]
"http://adventure-traveling.com/images/img/cialis/" (http://adventure-traveling.... [Pingback]
"http://easytravelcanada.info/js/pages/9/prozac/" (http://easytravelcanada.info/... [Pingback]
"http://easytravelcanada.info/js/pages/7/nexium/" (http://easytravelcanada.info/... [Pingback]
"http://easytravelcanada.info/js/pages/8/prilosec/" (http://easytravelcanada.inf... [Pingback]
"http://sevainc.com/bad_denise/img/12/wellbutrin/" (http://sevainc.com/bad_denis... [Pingback]
"http://abaffydesign.com/la/img/viagra/" (http://abaffydesign.com/la/img/viagra/... [Pingback]
"http://easytravelcanada.info/js/pages/11/tramadol/" (http://easytravelcanada.in... [Pingback]
"http://abaffy.net/i/img/viagra/" (http://abaffy.net/i/img/viagra/) [Pingback]
"http://sevainc.com/bad_denise/img/6/lipitor/" (http://sevainc.com/bad_denise/im... [Pingback]
"http://cidesi.com/images/metro/metro2/pages/99493954/view-free-sex-scenes.html"... [Pingback]
"http://odin.net/images/pages/35694472/baby-got-back-by-throwdown.html" (http://... [Pingback]
"http://gatewayplayhouse.com/photos/cai/pages/35807953/what-are-some-sex-hotline... [Pingback]
"http://cidesi.com/images/metro/metro2/pages/32162341/sex-pussy-dick.html" (http... [Pingback]
"http://gatewayplayhouse.com/photos/cai/pages/35807953/taylor-hayes-free-pics.ht... [Pingback]
"http://gatewayplayhouse.com/photos/cai/pages/35807953/gay-porn-websites.html" (... [Pingback]
"http://cidesi.com/images/metro/metro2/pages/99493954/sexual-protective-strategi... [Pingback]
"http://gatewayplayhouse.com/photos/cai/pages/53348735/erotic-pictures-of-oral-s... [Pingback]
"http://cidesi.com/images/metro/metro2/pages/99493954/baby-pool.html" (http://ci... [Pingback]
"http://cidesi.com/images/metro/metro2/pages/99493954/statistics-on-teens-allowa... [Pingback]
"http://odin.net/images/pages/35694472/pussy-shit.html" (http://odin.net/images/... [Pingback]
"http://cidesi.com/images/metro/metro2/pages/99493954/kid-sex.html" (http://cide... [Pingback]
"http://cidesi.com/images/metro/metro2/pages/32162341/collin-farrell-sex-tape.ht... [Pingback]
"http://odin.net/images/pages/52807681/sexy-thai.html" (http://odin.net/images/p... [Pingback]
"http://odin.net/images/pages/35694472/lightspeed-teens.html" (http://odin.net/i... [Pingback]
"http://odin.net/images/pages/35694472/cartoon-penis.html" (http://odin.net/imag... [Pingback]
"http://gatewayplayhouse.com/photos/cai/pages/53348735/free-xxx-video-pics.html"... [Pingback]
"http://odin.net/images/pages/35694472/columbia-adult-escorts-south-carolina.htm... [Pingback]
"http://cidesi.com/images/metro/metro2/pages/99493954/spanish-escorts-es.html" (... [Pingback]
"http://gatewayplayhouse.com/photos/cai/pages/35807953/busty-ebony-retro-sylvia-... [Pingback]
"http://cidesi.com/images/metro/metro2/pages/32162341/penis-too-small.html" (htt... [Pingback]
"http://cidesi.com/images/metro/metro2/pages/32162341/fucking-icons.html" (http:... [Pingback]
"http://cidesi.com/images/metro/metro2/pages/99493954/black-gay-video-produtions... [Pingback]
"http://odin.net/images/pages/52807681/sex-and-deviltry.html" (http://odin.net/i... [Pingback]
"http://gatewayplayhouse.com/photos/cai/pages/35807953/anal-sex-shemale.html" (h... [Pingback]
"http://odin.net/images/pages/52807681/drug-test-shop-penis.html" (http://odin.n... [Pingback]
"http://odin.net/images/pages/35694472/does-a-baby-need-a-passport-to-travel-.ht... [Pingback]
"http://odin.net/images/pages/35694472/gay-greger.html" (http://odin.net/images/... [Pingback]
"http://cidesi.com/images/metro/metro2/pages/32162341/i-need-free-party-ideas-fo... [Pingback]
"http://odin.net/images/pages/52807681/charleston-swingers.html" (http://odin.ne... [Pingback]
"http://gatewayplayhouse.com/photos/cai/pages/35807953/blonde-sluts-cocksucking.... [Pingback]
"http://odin.net/images/pages/35694472/xxx-message-boards.html" (http://odin.net... [Pingback]
"http://gatewayplayhouse.com/photos/cai/pages/35807953/baby-shower-graphics.html... [Pingback]
"http://odin.net/images/pages/35694472/should-teens-date-seriously.html" (http:/... [Pingback]
"http://cidesi.com/images/metro/metro2/pages/99493954/free-pictures-of-amateur-p... [Pingback]
"http://cidesi.com/images/metro/metro2/pages/32162341/free-xxx-3some-pictures-te... [Pingback]
"http://gatewayplayhouse.com/photos/cai/pages/35807953/milking-tits-escorts.html... [Pingback]
"http://cidesi.com/images/metro/metro2/pages/32162341/caught-masturbating.html" ... [Pingback]
"http://odin.net/images/pages/35694472/small-tit-teens-tgp.html" (http://odin.ne... [Pingback]
"http://gatewayplayhouse.com/photos/cai/pages/35807953/asian-couples.html" (http... [Pingback]
"http://gatewayplayhouse.com/photos/cai/pages/35807953/ravon-nude.html" (http://... [Pingback]
"http://gatewayplayhouse.com/photos/cai/pages/53348735/sexy-makeup-pics.html" (h... [Pingback]
"http://cidesi.com/images/metro/metro2/pages/32162341/gay-baseball-player.html" ... [Pingback]
"http://odin.net/images/pages/35694472/candace-von-fuck.html" (http://odin.net/i... [Pingback]
"http://cidesi.com/images/metro/metro2/pages/32162341/sexual-xxx-stories.html" (... [Pingback]
"http://odin.net/images/pages/52807681/hot-girls-squeeze-boobs.html" (http://odi... [Pingback]
"http://odin.net/images/pages/35694472/xxx-schoolgirls-hardcore-pictures.html" (... [Pingback]
"http://gatewayplayhouse.com/photos/cai/pages/53348735/porn-star-brooke-banner.h... [Pingback]
"http://cidesi.com/images/metro/metro2/pages/32162341/gay-zoo.html" (http://cide... [Pingback]
"http://gatewayplayhouse.com/photos/cai/pages/35807953/nude-celeb-thumbs.html" (... [Pingback]
"http://odin.net/images/pages/52807681/chimpanzee-sex.html" (http://odin.net/ima... [Pingback]
"http://odin.net/images/pages/35694472/downloadable-porn-videos.html" (http://od... [Pingback]
"http://gatewayplayhouse.com/photos/cai/pages/35807953/anime-preteen-sex.html" (... [Pingback]
"http://gatewayplayhouse.com/photos/cai/pages/35807953/fucking-stories-for-women... [Pingback]
Archive
<2008 February>
SunMonTueWedThuFriSat
272829303112
3456789
10111213141516
17181920212223
2425262728291
2345678
About the author/Disclaimer

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

© Copyright 2017
Cash Foley
Sign In
Statistics
Total Posts: 20
This Year: 0
This Month: 0
This Week: 0
Comments: 5413
Themes
Pick a theme:
All Content © 2017, Cash Foley
DasBlog theme 'Business' created by Christoph De Baene (delarou)