Sha256: f029baff3c961eab52df68c48f14dd03291333202771255c1ee9ca60baa59ab5

Contents?: true

Size: 1.02 KB

Versions: 1

Compression:

Stored size: 1.02 KB

Contents

module Screengem
  module Factories
    #
    # Knows how to create a Question from a question name.
    #
    class QuestionFactory < BasicObject
      include ::Singleton

      definition = ::RUBY_VERSION >= "2.7" ? "..." : "*args"

      class_eval <<~RUBY, __FILE__, __LINE__ + 1
        def method_missing(question_name, #{definition})
          question_class_name = "\#{question_name}_question".camelize
          question_class = "\#{question_scope}::\#{question_class_name}".constantize

          question_class.new(#{definition})
        rescue => e
          QuestionError.new(<<~MSG)
            Unable to create question: '\#{question_class_name}'.
              Details: \#{e.message}
          MSG
        end
      RUBY

      def respond_to_missing?(_question_name, *)
        true
      end

      class QuestionError < ::Screengem::Question
        include FactoryCreationError
      end

      private

      def question_scope
        @question_scope ||= ::Screengem.configuration.question_scope
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
screengem-0.18.0 lib/screengem/factories/question_factory.rb