Module: Chef::Mixin::RecipeDefinitionDSLCore

Includes:
ConvertToClassName, Language
Included in:
Provider, Recipe
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
# 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
    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