Class: Boil::Composer::DependencyWalker
- Inherits:
-
Object
- Object
- Boil::Composer::DependencyWalker
- Includes:
- ReflectionHelpers
- Defined in:
- lib/boil/composer/dependency_walker.rb
Constant Summary
Constants included from ReflectionHelpers
ReflectionHelpers::ClassConstNotFound
Instance Method Summary collapse
- #class_from_constructor_param(parent_class, constructor_param) ⇒ Object
- #create_factory_method_for_class(cls) ⇒ Object
- #create_factory_methods_for_dependencies(cls) ⇒ Object
-
#initialize(target_class) ⇒ DependencyWalker
constructor
A new instance of DependencyWalker.
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 |