module Realm::Mixins::DependencyInjection::ClassMethods

Public Instance Methods

dependencies() click to toggle source
# File lib/realm/mixins/dependency_injection.rb, line 23
def dependencies
  deps.freeze
end
inject(*dependables, **options) click to toggle source
# File lib/realm/mixins/dependency_injection.rb, line 19
def inject(*dependables, **options)
  deps.concat(dependables.map { |d| Dependency.new(d, **options) })
end
new(*args, **kwargs, &block) click to toggle source
# File lib/realm/mixins/dependency_injection.rb, line 11
def new(*args, **kwargs, &block)
  instance = allocate
  deps.each { |d| define_dependency_method(instance, kwargs, d) }
  kwargs_without_dependencies = kwargs.reject { |k, _| deps.any? { |d| d.name == k } }
  instance.send(:initialize, *args, **kwargs_without_dependencies, &block)
  instance
end

Private Instance Methods

define_dependency_method(instance, kwargs, spec) click to toggle source
# File lib/realm/mixins/dependency_injection.rb, line 33
def define_dependency_method(instance, kwargs, spec)
  dependency = kwargs[spec.name]
  instance.singleton_class.class_eval do
    define_method(spec.name) do
      return dependency unless spec.lazy?

      var = "@#{spec.name}"
      return instance_variable_get(var) if instance_variable_defined?(var)

      instance_variable_set(var, dependency.respond_to?(:call) ? dependency.call : dependency)
    end
    protected spec.name
  end
end
deps() click to toggle source
# File lib/realm/mixins/dependency_injection.rb, line 29
def deps
  @deps ||= []
end