Sha256: 2af904cba8e713bd5e6f155d3572ef02a068c888988a7a1610cf289c263adb93

Contents?: true

Size: 1.06 KB

Versions: 3

Compression:

Stored size: 1.06 KB

Contents

module BusinessFlow
  class Step
    attr_reader :klass, :inputs, :outputs
    def initialize(klass, inputs, outputs, flow_klass)
      @klass = klass
      @inputs = inputs
      @outputs = outputs
      @flow_klass = flow_klass
    end

    # @klass can be a symbol or class
    def dispatch(flow, inputs)
      callable.call(flow, inputs)
    end

    private

    def callable
      @callable ||=
        if @klass.is_a?(Symbol) &&
           @flow_klass.method_defined?(@klass) ||
           @flow_klass.private_method_defined?(@klass)
          proc { |flow, _| flow.send(@klass) && nil }
        else
          @klass = lookup_klass ||
                   raise(NameError, "undefined constant #{@klass}")
          proc { |_, inputs| @klass.call(inputs) }
        end
    end

    def lookup_klass
      return @klass unless @klass.is_a?(Symbol)
      constant_name = @klass.to_s.camelcase
      @flow_klass.parents.each do |parent|
        begin
          break parent.const_get(constant_name)
        rescue NameError
          next
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
business_flow-0.1.2 lib/business_flow/step.rb
business_flow-0.1.1 lib/business_flow/step.rb
business_flow-0.1.0 lib/business_flow/step.rb