def re_apply(fei, opts={})

      @context.storage.put_msg(
        'cancel',
        'fei' => FlowExpressionId.extract_h(fei),
        're_apply' => Ruote.keys_to_s(opts))
    end
def re_apply(fei, opts={})

      @context.storage.put_msg(
        'cancel',
        'fei' => FlowExpressionId.extract_h(fei),
        're_apply' => Ruote.keys_to_s(opts))
    end
Re-applies an expression (given via its FlowExpressionId).

 That will cancel the expression and, once the cancel operation is over
 (all the children have been cancelled), the expression will get
 re-applied.

 The fei parameter may be a hash, a Ruote::FlowExpressionId instance,
 a Ruote::Workitem instance or a sid string.

 == options

 :tree is used to completely change the tree of the expression at re_apply

   dashboard.re_apply(
     fei, :tree => [ 'participant', { 'ref' => 'bob' }, [] ])

 :fields is used to replace the fields of the workitem at re_apply

   dashboard.re_apply(
     fei, :fields => { 'customer' => 'bob' })

 :workitem is ok too

   dashboard.re_apply(
     fei, :workitem => { 'fields' => { 'customer' => 'bob' } })

 :merge_in_fields is used to add / override fields

   dashboard.re_apply(
     fei, :merge_in_fields => { 'customer' => 'bob' })