module Injectable::InstanceMethods

Public Class Methods

new(args = {}) click to toggle source

Initialize the service with the dependencies injected

Calls superclass method
# File lib/injectable/instance_methods.rb, line 4
def initialize(args = {})
  check_missing_arguments!(self.class.required_initialize_arguments, args)
  variables_for!(self.class.initialize_arguments, args)
  variables_from_dependencies!(args)
  super()
end

Public Instance Methods

call(args = {}) click to toggle source

Entry point of the service. Arguments for this method should be declared explicitly with '.argument' and declare this method without arguments

Calls superclass method
# File lib/injectable/instance_methods.rb, line 14
def call(args = {})
  check_call_definition!
  check_missing_arguments!(self.class.required_call_arguments, args)
  variables_for!(self.class.call_arguments, args)
  super()
end

Private Instance Methods

check_call_definition!() click to toggle source
# File lib/injectable/instance_methods.rb, line 23
def check_call_definition!
  return if (self.class.ancestors - [Injectable::InstanceMethods]).any? do |ancestor|
    ancestor.instance_methods(false).include?(:call)
  end
  raise NoMethodError, "A #call method with zero arity must be defined in #{self.class}"
end
check_missing_arguments!(expected, args) click to toggle source
# File lib/injectable/instance_methods.rb, line 30
def check_missing_arguments!(expected, args)
  missing = expected - args.keys
  return if missing.empty?
  raise ArgumentError, "missing keywords: #{missing.join(',')}"
end
dependencies_proxy() click to toggle source
# File lib/injectable/instance_methods.rb, line 49
def dependencies_proxy
  @dependencies_proxy ||= self.class.dependencies.proxy
end
variables_for!(subject, args) click to toggle source
# File lib/injectable/instance_methods.rb, line 36
def variables_for!(subject, args)
  subject.each do |arg, options|
    instance_variable_set("@#{arg}", args.fetch(arg) { options[:default] })
  end
end
variables_from_dependencies!(args) click to toggle source
# File lib/injectable/instance_methods.rb, line 42
def variables_from_dependencies!(args)
  self.class.dependencies.names.each do |name|
    next if self.class.initialize_arguments.key?(name)
    instance_variable_set("@#{name}", args[name]) if args.key?(name)
  end
end