Module: Chef::Mixin::RecipeDefinitionDSLCore

Includes:
ConvertToClassName, Language
Included in:
Provider, Provider::Deploy, 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?, #platform_family?, #search, #value_for_platform, #value_for_platform_family

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



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
78
79
80
81
82
# File 'lib/chef/mixin/recipe_definition_dsl_core.rb', line 37

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.

    # Checks the new platform => short_name => resource mapping initially
    # then fall back to the older approach (Chef::Resource.const_get) for
    # backward compatibility
    resource_class = Chef::Resource.resource_for_node(method_symbol, run_context.node)

    super unless resource_class
    raise ArgumentError, "You must supply a name when declaring a #{method_symbol} resource" unless args.size > 0

    # If we have a resource like this one, we want to steal its state
    args << run_context
    resource = resource_class.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
    # Evaluate resource attribute DSL
    resource.instance_eval(&block) if block

    # Run optional resource hook
    resource.after_created

    run_context.resource_collection.insert(resource)
    resource
  end
end