org.codehaus.groovy.runtime

## Class ComposedClosure<V>

- java.lang.Object
- - groovy.lang.GroovyObjectSupport
  - - groovy.lang.Closure<V>
    - - org.codehaus.groovy.runtime.ComposedClosure<V>

- All Implemented Interfaces:
    GroovyCallable<V>, GroovyObject, Serializable, Cloneable, Runnable, Callable<V>

      public final class ComposedClosure<V>
      extends Closure<V>

  A wrapper for Closure to support composition. Normally used only internally through the `rightShift()` and `leftShift()` methods on `Closure`.

  Typical usages:

       def twice = { a -> a * 2 }
       def inc = { b -> b + 1 }
       def f = { x -> twice(inc(x)) } // longhand
       def g = inc >> twice
       def h = twice << inc
       assert f(10) == 22
       assert g(10) == 22
       assert h(10) == 22

       def s2c = { it.chars[0] }
       def p = Integer.&toHexString >> s2c >> Character.&toUpperCase
       assert p(15) == 'F'

       def multiply = { a, b -> a * b }
       def identity = { a -> [a, a] }
       def sq = identity >> multiply
       assert (1..5).collect{ sq(it) } == [1, 4, 9, 16, 25]

       def add3 = { a, b, c -> a + b + c }
       def add2plus10 = add3.curry(10)
       def multBoth = { a, b, c -> [a*c, b*c] }
       def twiceBoth = multBoth.rcurry(2)
       def twiceBothPlus10 = twiceBoth >> add2plus10
       assert twiceBothPlus10(5, 10) == 40

  See Also:
    Serialized Form

- - ### Field Summary

    - ### Fields inherited from class groovy.lang.Closure

      `DELEGATE_FIRST, DELEGATE_ONLY, DONE, IDENTITY, maximumNumberOfParameters, OWNER_FIRST, OWNER_ONLY, parameterTypes, SKIP, TO_SELF`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `ComposedClosure(Closure first, Closure<V> second)`

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `V` | `call(Object... args)`
    `Object` | `clone()`
    `Object` | `doCall(Object... args)`
    `Object` | `getDelegate()`
    `Class[]` | `getParameterTypes()`
    `int` | `getResolveStrategy()` Gets the strategy which the closure uses to resolve methods and properties
    `void` | `setDelegate(Object delegate)` Allows the delegate to be changed such as when performing markup building
    `void` | `setResolveStrategy(int resolveStrategy)` Sets the strategy which the closure uses to resolve property references and methods.

    - ### Methods inherited from class groovy.lang.Closure

      `asWritable, call, call, curry, curry, dehydrate, getDirective, getMaximumNumberOfParameters, getOwner, getProperty, getThisObject, isCase, leftShift, leftShift, memoize, memoizeAtLeast, memoizeAtMost, memoizeBetween, ncurry, ncurry, rcurry, rcurry, rehydrate, rightShift, run, setDirective, setProperty, throwRuntimeException, trampoline, trampoline`

    - ### Methods inherited from class groovy.lang.GroovyObjectSupport

      `getMetaClass, invokeMethod, setMetaClass`

    - ### Methods inherited from class java.lang.Object

      `equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### ComposedClosure

          public ComposedClosure(Closure first,
                                 Closure<V> second)

  - ### Method Detail

    - #### setDelegate

          public void setDelegate(Object delegate)

      Description copied from class: `Closure`
      Allows the delegate to be changed such as when performing markup building
      Overrides:
        `setDelegate` in class `Closure<V>`
      Parameters:
        `delegate` - the new delegate

    - #### getDelegate

          public Object getDelegate()

      Overrides:
        `getDelegate` in class `Closure<V>`
      Returns:
        the delegate Object to which method calls will go which is typically the outer class when the closure is constructed

    - #### setResolveStrategy

          public void setResolveStrategy(int resolveStrategy)

      Description copied from class: `Closure`
      Sets the strategy which the closure uses to resolve property references and methods. The default is Closure.OWNER_FIRST
      Overrides:
        `setResolveStrategy` in class `Closure<V>`
      Parameters:
        `resolveStrategy` - The resolve strategy to set
      See Also:
        `Closure.DELEGATE_FIRST`, `Closure.DELEGATE_ONLY`, `Closure.OWNER_FIRST`, `Closure.OWNER_ONLY`, `Closure.TO_SELF`

    - #### getResolveStrategy

          public int getResolveStrategy()

      Description copied from class: `Closure`
      Gets the strategy which the closure uses to resolve methods and properties
      Overrides:
        `getResolveStrategy` in class `Closure<V>`
      Returns:
        The resolve strategy
      See Also:
        `Closure.DELEGATE_FIRST`, `Closure.DELEGATE_ONLY`, `Closure.OWNER_FIRST`, `Closure.OWNER_ONLY`, `Closure.TO_SELF`

    - #### clone

          public Object clone()

      Overrides:
        `clone` in class `Closure<V>`

    - #### getParameterTypes

          public Class[] getParameterTypes()

      Overrides:
        `getParameterTypes` in class `Closure<V>`
      Returns:
        the parameter types of the longest doCall method of this closure

    - #### doCall

          public Object doCall(Object... args)

    - #### call

          public V call(Object... args)

      Overrides:
        `call` in class `Closure<V>`