Sha256: 7903a06c80380e1a77f575e5a155903f151ef0c7be84bf1f0d17bfb95a3e2a52

Contents?: true

Size: 1.95 KB

Versions: 8

Compression:

Stored size: 1.95 KB

Contents

# frozen_string_literal: true

require "dry/system/errors"

module Dry
  module System
    # Default component loader implementation
    #
    # This class is configured by default for every System::Container. You can
    # provide your own and use it in your containers too.
    #
    # @example
    #   class MyLoader < Dry::System::Loader
    #     def call(*args)
    #       constant.build(*args)
    #     end
    #   end
    #
    #   class MyApp < Dry::System::Container
    #     configure do |config|
    #       # ...
    #       config.component_dirs.loader = MyLoader
    #     end
    #   end
    #
    # @api public
    class Loader
      class << self
        # Requires the component's source file
        #
        # @api public
        def require!(component)
          require(component.require_path)
          self
        end

        # Returns an instance of the component
        #
        # Provided optional args are passed to object's constructor
        #
        # @param [Array] args Optional constructor args
        #
        # @return [Object]
        #
        # @api public
        def call(component, *args)
          require!(component)

          constant = self.constant(component)

          if singleton?(constant)
            constant.instance(*args)
          else
            constant.new(*args)
          end
        end
        ruby2_keywords(:call) if respond_to?(:ruby2_keywords, true)

        # Returns the component's class constant
        #
        # @return [Class]
        #
        # @api public
        def constant(component)
          inflector = component.inflector
          const_name = inflector.camelize(component.const_path)
          inflector.constantize(const_name)
        rescue NameError => e
          raise ComponentNotLoadableError.new(component, e)
        end

        private

        def singleton?(constant)
          constant.respond_to?(:instance) && !constant.respond_to?(:new)
        end
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
dry-system-1.0.0.rc1 lib/dry/system/loader.rb
dry-system-0.27.2 lib/dry/system/loader.rb
dry-system-0.27.1 lib/dry/system/loader.rb
dry-system-0.27.0 lib/dry/system/loader.rb
dry-system-0.26.0 lib/dry/system/loader.rb
dry-system-0.25.0 lib/dry/system/loader.rb
dry-system-0.24.0 lib/dry/system/loader.rb
dry-system-0.23.0 lib/dry/system/loader.rb