lib/blueprints/dependency.rb in blueprints-0.8.2 vs lib/blueprints/dependency.rb in blueprints-0.9.0
- old
+ new
@@ -1,36 +1,47 @@
-# Class for defining blueprint dependencies. Accepts up to 3 params:
-# * name - pass the name of blueprint to build when trying to access value of this dependency.
-# * iv_name (optional) - pass the name of instance variable to use for value. Defaults to same name as blueprint name.
-# * options (optional) - pass options that are then passed to blueprint when building.
-# Examples:
-# Blueprints::Dependency.new(:blueprint).value # Builds blueprint 'blueprint' and returns value of @blueprint instance variable
-# Blueprints::Dependency.new(:blueprint, value).value # Builds blueprint 'blueprint' and returns value of @value instance variable
-# Blueprints::Dependency.new(:blueprint, :option => true).value # Builds blueprint 'blueprint' with options and returns value of @value instance variable
-#
-# Blueprints::Dependency objects also catch all missing methods. They are later replayed on instance variable when getting value. Example:
-# d = Blueprints::Dependency.new(:blueprint).name.size
-# d.value # => 4 when @blueprint.name == 'John'
+# Class for defining blueprint dependencies.
class Blueprints::Dependency
instance_methods.each { |m| undef_method m if m =~ /^(to_|id$)/ }
- # Initializes new copy of Blueprints::Dependency with name, iv_name and options.
+ # Initializes new Blueprints::Dependency object.
+ # @example Build blueprint 'blueprint' and returns value of @blueprint instance variable.
+ # Blueprints::Dependency.new(:blueprint)
+ # @example Build blueprint 'blueprint' and returns value of @value instance variable.
+ # Blueprints::Dependency.new(:blueprint, value)
+ # @example Build blueprint 'blueprint' with options and returns value of @value instance variable.
+ # Blueprints::Dependency.new(:blueprint, :option => true)
+ # @example Register called methods
+ # d = Blueprints::Dependency.new(:blueprint).name.size
+ # @overload d(name, options = {})
+ # Use result of blueprint/namespace +name+ and pass options when building.
+ # @param [Symbol, String] name Name of blueprint/namespace.
+ # @param [Hash] options Options to pass when building blueprint/namespace.
+ # @overload d(name, instance_variable_name, options = {})
+ # Build blueprint/namespace with options and use differently names instance variable as result.
+ # @param [Symbol, String] name Name of blueprint/namespace.
+ # @param [Symbol, String] instance_variable_name Name of instance variable to use as a result.
+ # @param [Hash] options Options to pass when building blueprint/namespace.
def initialize(name, *args)
- @name = name
- @options = args.extract_options!
- @iv_name = args.first || @name
+ @name = name
+ @options = args.extract_options!
+ @iv_name = (args.first || @name).to_s.gsub('.', '_')
@registry = []
end
- # Builds blueprint (if necessary) and returns the value of instance variable.
- def blueprint_value
- Blueprints::RootNamespace.root.build @name => @options
- @registry.inject(Blueprints::RootNamespace.root.context.instance_variable_get(:"@#{@iv_name}")) do |value, (method, args, block)|
- value.send(method, *args, &block)
+ # Returns block that builds blueprint (if necessary) takes instance variable for this dependency and calls all methods from method registry.
+ # @return [Proc] Proc that can be called to return value for this dependency.
+ def to_proc
+ name, options, registry, variable_name = @name, @options, @registry, @iv_name
+ Proc.new do
+ build name => options
+ registry.inject(instance_variable_get(:"@#{variable_name}")) do |value, (method, args, block)|
+ value.send(method, *args, &block)
+ end
end
end
# Catches all missing methods to later replay when asking for value.
+ # @return [Blueprints::Dependency] self
def method_missing(method, *args, &block)
@registry << [method, args, block]
self
end
end