Class: Boil::Composer::DependencyWalker

Inherits:
Object
  • Object
show all
Includes:
ReflectionHelpers
Defined in:
lib/boil/composer/dependency_walker.rb

Constant Summary

Constants included from ReflectionHelpers

ReflectionHelpers::ClassConstNotFound

Instance Method Summary collapse

Methods included from ReflectionHelpers

#class_name?, #constantize_class, #constructor_parameters

Constructor Details

#initialize(target_class) ⇒ DependencyWalker

Returns a new instance of DependencyWalker.



8
9
10
# File 'lib/boil/composer/dependency_walker.rb', line 8

def initialize(target_class)
  @target_class = target_class
end

Instance Method Details

#class_from_constructor_param(parent_class, constructor_param) ⇒ Object



37
38
39
40
# File 'lib/boil/composer/dependency_walker.rb', line 37

def class_from_constructor_param(parent_class, constructor_param)
  parent_module_name = parent_class.parent.to_s
  class_name = "#{parent_module_name}::#{constructor_param.to_s.camelize}"
end

#create_factory_method_for_class(cls) ⇒ Object



12
13
14
15
16
17
18
19
# File 'lib/boil/composer/dependency_walker.rb', line 12

def create_factory_method_for_class(cls)
  begin
    create_factory_methods_for_dependencies(constantize_class(cls))
    @target_class.define_factory_method(cls)
  rescue SystemStackError
    raise "Stack too deep when trying to define factory method for #{cls} -- circular reference in initialize parameters?"
  end
end

#create_factory_methods_for_dependencies(cls) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/boil/composer/dependency_walker.rb', line 21

def create_factory_methods_for_dependencies(cls)
  constructor_parameters(cls).each do |param|
    begin
      if class_name?(class_from_constructor_param(cls, param))
        create_factory_method_for_class(class_from_constructor_param(cls, param))
      else 
        # If it's already defined, we don't care that there is no corresponding class.
        raise ClassConstNotFound unless @target_class.method_defined?(param)
      end
    rescue ClassConstNotFound
      class_name = class_from_constructor_param(cls, param)
      raise "#{cls} has constructor argument '#{param}' without a corresponding class (#{class_name})"
    end
  end
end