# encoding: ascii
# api: powershell
# title: Copy-Function
# description: Copy a function from your current session to another session. Allows you to easily copy function definitions into remote PSSessions.
# version: 0.1
# type: function
# license: CC0
# function: Copy-Function
# x-poshcode-id: 1410
# x-archived: 2009-10-26T15:25:35
#
#
#Requires -Version 2.0

<#
   .Synopsis
      Copy a function from the current session to another session
   .Description
      Copies a function deffinition from the current session into any other session
   .Parameter Session
      The session(s) you want to define the function in
   .Parameter Name
      The Name of the function to copy
   .Parameter Definition
      The optional definition of the function. This is used to allow copying via the pipeline.
   .Parameter Force
      Overwrite existing functions in the session.
   .Parameter Passthru
      Output the FunctionInfo from the session
   .Example
      Copy-Function -Session $Session1 -Name Prompt -Force
        
      Copies the prompt function from the current session into the specified session, overwriting the existing prompt function.
   .Example
      Get-Command -Type Function | Copy-Function $Session1
      
      Copies all of the functions from the current session into the new session.
   .Notes
      
    
#>
function Copy-Function {
[CmdletBinding(SupportsShouldProcess=$true)]
Param(
   [Parameter(Mandatory=$true, Position=0)]
   [System.Management.Automation.Runspaces.PSSession[]]
   $Session, 

   [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true,Mandatory=$true,Position=1)]
   [String]
   $name, 

   [Parameter(ValueFromPipelineByPropertyName=$true,Mandatory=$false)]
   [String]
   $Definition,
   
   [Switch]
   $Force,
   
   [Switch]
   $Passthru
   
)

Process { 
   if( $PSCmdlet.ShouldProcess("Copied function $Name to sessions: $(($Session|select -expand Name) -join ', ')","Copy function `"$Name`"?","Copying functions to sessions: $(($Session|select -expand Name) -join ', ')") ) {
      if(!$Definition){ $Definition = (gcm -type function $name).Definition }
      If(!$Passthru) {
         Invoke-Command { 
            Param($name, $value, $force) 
            $null = new-item function:"$name" -value $value -force:$force
         } -Session $Session -ArgumentList $Name,$Definition,$Force
      } else {
         Invoke-Command { 
            Param($name, $value, $force) 
            new-item function:"$name" -value $value -force:$force
         } -Session $Session -ArgumentList $Name,$Definition,$Force
      }   
   }
}
}
