Module: Chef::Mixin::RecipeDefinitionDSLCore
- Includes:
- ConvertToClassName, Language
- Defined in:
- lib/chef/mixin/recipe_definition_dsl_core.rb
Instance Method Summary collapse
Methods included from Language
#data_bag, #data_bag_item, #platform?, #search, #value_for_platform
Methods included from ConvertToClassName
#convert_to_class_name, #convert_to_snake_case, #filename_to_qualified_string, #snake_case_basename
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method_symbol, *args, &block) ⇒ Object
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/chef/mixin/recipe_definition_dsl_core.rb', line 36 def method_missing(method_symbol, *args, &block) # If we have a definition that matches, we want to use that instead. This should # let you do some really crazy over-riding of "native" types, if you really want # to. if run_context.definitions.has_key?(method_symbol) # This dupes the high level object, but we still need to dup the params new_def = run_context.definitions[method_symbol].dup new_def.params = new_def.params.dup new_def.node = run_context.node # This sets up the parameter overrides new_def.instance_eval(&block) if block new_recipe = Chef::Recipe.new(cookbook_name, @recipe_name, run_context) new_recipe.params = new_def.params new_recipe.params[:name] = args[0] new_recipe.instance_eval(&new_def.recipe) else # Otherwise, we're rocking the regular resource call route. method_name = method_symbol.to_s rname = convert_to_class_name(method_name) super unless Chef::Resource.const_defined?(rname) raise ArgumentError, "You must supply a name when declaring a #{method_name} resource" unless args.size > 0 # If we have a resource like this one, we want to steal its state args << run_context resource = Chef::Resource.const_get(rname).new(*args) resource.load_prior_resource resource.cookbook_name = cookbook_name # TODO: 5/21/2010 cw/dan: do we need recipe_name for # anything? it's not even possible that this ivar is set on # Chef::Provider. # resource.recipe_name = @recipe_name resource.params = @params resource.source_line = caller[0] # Determine whether this resource is being created in the context of an enclosing Provider resource.enclosing_provider = self.is_a?(Chef::Provider) ? self : nil resource.instance_eval(&block) if block run_context.resource_collection.insert(resource) resource end end |