Sha256: 971cefd821accd3b6de442a17f66e649d0fba098f6f558b688244e6570293450

Contents?: true

Size: 1.27 KB

Versions: 15

Compression:

Stored size: 1.27 KB

Contents

require "dry/auto_inject"

class Trailblazer::Operation
  # Thanks, @timriley! <3
  # https://gist.github.com/timriley/d314a58da9784912159006e208ba8ea9
  module AutoInject
    class InjectStrategy < Module
      ClassMethods = Class.new(Module)

      attr_reader :container
      attr_reader :dependency_map
      attr_reader :class_mod

      def initialize(container, *dependency_names)
        @container = container
        @dependency_map = Dry::AutoInject::DependencyMap.new(*dependency_names)
        @class_mod = ClassMethods.new
      end

      def included(klass)
        define_call

        klass.singleton_class.prepend @class_mod

        super
      end

      private

      def define_call
        class_mod.class_exec(container, dependency_map) do |container, dependency_map|
          define_method :call do |params={}, options={}, *dependencies|
            options_with_deps = dependency_map.to_h.each_with_object({}) { |(name, identifier), obj|
              obj[name] = options[name] || container[identifier]
            }.merge(options)

            super(params, options_with_deps, *dependencies)
          end
        end
      end
    end
  end

  def self.AutoInject(container)
    Dry::AutoInject(container, strategies: {default: AutoInject::InjectStrategy})
  end
end

Version data entries

15 entries across 15 versions & 1 rubygems

Version Path
trailblazer-2.1.0.beta3 lib/trailblazer/operation/auto_inject.rb
trailblazer-2.1.0.beta2 lib/trailblazer/operation/auto_inject.rb
trailblazer-2.1.0.beta1 lib/trailblazer/operation/auto_inject.rb
trailblazer-2.0.7 lib/trailblazer/operation/auto_inject.rb
trailblazer-2.0.6 lib/trailblazer/operation/auto_inject.rb
trailblazer-2.0.5 lib/trailblazer/operation/auto_inject.rb
trailblazer-2.0.4 lib/trailblazer/operation/auto_inject.rb
trailblazer-2.0.3 lib/trailblazer/operation/auto_inject.rb
trailblazer-2.0.2 lib/trailblazer/operation/auto_inject.rb
trailblazer-2.0.1 lib/trailblazer/operation/auto_inject.rb
trailblazer-2.0.0 lib/trailblazer/operation/auto_inject.rb
trailblazer-2.0.0.rc1 lib/trailblazer/operation/auto_inject.rb
trailblazer-2.0.0.beta3 lib/trailblazer/operation/auto_inject.rb
trailblazer-2.0.0.beta2 lib/trailblazer/operation/auto_inject.rb
trailblazer-2.0.0.beta1 lib/trailblazer/operation/auto_inject.rb