Sha256: 2b7d9e2b8c8b5dd4ab74868ee48636803472a052eb5686c3a0b7bbbcaddabaee

Contents?: true

Size: 1.68 KB

Versions: 241

Compression:

Stored size: 1.68 KB

Contents

module RGen

module Instantiator

class AbstractInstantiator

	ResolverDescription = Struct.new(:from, :attribute, :block) # :nodoc:

	class << self
		attr_accessor :resolver_descs
	end

	def initialize(env)
		@env = env
	end

	# Specifies that +attribute+ should be resolved. If +:class+ is specified, 
	# resolve +attribute+ only for objects of type class.
	# The block must return the value to which the attribute should be assigned.
	# The object for which the attribute is to be resolved will be accessible
	# in the current context within the block.
	# 
	def self.resolve(attribute, desc=nil, &block)
		from = (desc.is_a?(Hash) && desc[:class])
		self.resolver_descs ||= []
		self.resolver_descs << ResolverDescription.new(from, attribute, block)
	end
	
	# Resolves +attribute+ to a model element which has attribute +:id+ set to the
	# value currently in attribute +:src+
	# 
	def self.resolve_by_id(attribute, desc)
		id_attr = (desc.is_a?(Hash) && desc[:id])
		src_attr = (desc.is_a?(Hash) && desc[:src])
		raise StandardError.new("No id attribute given.") unless id_attr
		resolve(attribute) do
			@env.find(id_attr => @current_object.send(src_attr)).first
		end
	end
	
	private
	
	def method_missing(m, *args) #:nodoc:
		if @current_object
			@current_object.send(m)
		else
			super
		end
	end
	
	def resolve
		self.class.resolver_descs ||= []
		self.class.resolver_descs.each { |desc|
			@env.find(:class => desc.from).each { |e|
				old_object, @current_object = @current_object, e
				e.send("#{desc.attribute}=", instance_eval(&desc.block)) if e.respond_to?("#{desc.attribute}=")
				@current_object = old_object
			}
		}
	end			
	
end

end

end

Version data entries

241 entries across 241 versions & 3 rubygems

Version Path
rgen-0.10.2 lib/rgen/instantiator/abstract_instantiator.rb
rgen-0.10.0 lib/rgen/instantiator/abstract_instantiator.rb
rgen-0.9.1 ./lib/rgen/instantiator/abstract_instantiator.rb
rgen-0.8.3 lib/rgen/instantiator/abstract_instantiator.rb
rgen-0.8.4 lib/rgen/instantiator/abstract_instantiator.rb
rgen-0.9.0 lib/rgen/instantiator/abstract_instantiator.rb
puppet-retrospec-1.8.0 vendor/pup410/lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_instantiator.rb
puppet-retrospec-1.7.0 vendor/pup410/lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_instantiator.rb
puppet-4.10.12 lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_instantiator.rb
puppet-4.10.12-x86-mingw32 lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_instantiator.rb
puppet-4.10.12-x64-mingw32 lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_instantiator.rb
puppet-4.10.12-universal-darwin lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_instantiator.rb
puppet-4.10.11 lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_instantiator.rb
puppet-4.10.11-x86-mingw32 lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_instantiator.rb
puppet-4.10.11-x64-mingw32 lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_instantiator.rb
puppet-4.10.11-universal-darwin lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_instantiator.rb
puppet-4.10.10 lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_instantiator.rb
puppet-4.10.10-x86-mingw32 lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_instantiator.rb
puppet-4.10.10-x64-mingw32 lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_instantiator.rb
puppet-4.10.10-universal-darwin lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_instantiator.rb