# File lib/ruote/exp/fe_ref.rb, line 52
    def apply

      key = (attribute(:ref) || attribute_text).to_s

      if name != 'ref'
        key = name
        tree[1]['ref'] = key
      end

      key = dsub(key)
        # see test/functional/ft_62_

      key2, value = iterative_var_lookup(key)

      tree[1]['ref'] = key2 if key2
      tree[1]['original_ref'] = key if key2 != key

      unless value
        #
        # seems like it's a participant

        @h['participant'] =
          @context.plist.lookup_info(tree[1]['ref'], h.applied_workitem)

        value = key2 if ( ! @h['participant']) && (key2 != key)
      end

      new_exp_name, new_exp_class = nil

      # warning: abusing on 'then' in order to have [somehow] more readability

      if
        value.is_a?(String)
      then

        if
          @context['participant_in_variable_enabled'] &&
          value.match(/\bdef consume\(/) &&
          (Rufus::TreeChecker.parse(value) rescue false)
        then
          #
          # participant code passed

          @h['participant'] = [ 'Ruote::CodeParticipant', { 'code' => value } ]
          tree[1]['ref'] = key

        elsif klass = @context.expmap.expression_class(tree[1]['ref'])
          #
          # aliased expression

          new_exp_name = value
          new_exp_class = klass
        end

      elsif
        @context['participant_in_variable_enabled'] &&
        value.is_a?(Hash) &&
        value['on_workitem']
      then
        #
        # participant 'defined' in var

        @h['participant'] = [ 'Ruote::BlockParticipant', value ]

      elsif
        value.is_a?(Array) &&
        value.size == 2 && value.last.is_a?(Hash)
      then
        #
        # participant 'registered' in var

        @h['participant'] = value
      end

      if value == nil && @h['participant'] == nil
        #
        # unknown participant or subprocess

        @h['state'] = 'failed'
        persist_or_raise

        raise("unknown participant or subprocess '#{tree[1]['ref']}'")
      end

      new_exp_name, new_exp_class = if new_exp_name
        [ new_exp_name, new_exp_class ]
      elsif @h['participant']
        [ 'participant', Ruote::Exp::ParticipantExpression ]
      else
        [ 'subprocess', Ruote::Exp::SubprocessExpression ]
      end

      tree[0] = new_exp_name
      @h['name'] = new_exp_name

      new_exp = new_exp_class.new(@context, @h)

      #new_exp.initial_persist
        # not necessary

      new_exp.apply
    end