| Class | Puppet::Parser::AST::HostClass |
| In: |
lib/puppet/parser/ast/hostclass.rb
|
| Parent: | Puppet::Parser::AST::Definition |
The code associated with a class. This is different from definitions in that each class is a singleton — only one will exist for a given node.
Are we a child of the passed class? Do a recursive search up our parentage tree to figure it out.
# File lib/puppet/parser/ast/hostclass.rb, line 11
11: def child_of?(klass)
12: return false unless self.parentclass
13:
14: if klass == self.parentobj
15: return true
16: else
17: return self.parentobj.child_of?(klass)
18: end
19: end
Make sure our parent class has been evaluated, if we have one.
# File lib/puppet/parser/ast/hostclass.rb, line 22
22: def evaluate(scope)
23: if parentclass and ! scope.catalog.resource(self.class.name, parentclass)
24: parent_resource = parentobj.evaluate(scope)
25: end
26:
27: # Do nothing if the resource already exists; this makes sure we don't
28: # get multiple copies of the class resource, which helps provide the
29: # singleton nature of classes.
30: if resource = scope.catalog.resource(self.class.name, self.classname)
31: return resource
32: end
33:
34: super
35: end
Evaluate the code associated with this class.
# File lib/puppet/parser/ast/hostclass.rb, line 38
38: def evaluate_code(resource)
39: scope = resource.scope
40: # Verify that we haven't already been evaluated. This is
41: # what provides the singleton aspect.
42: if existing_scope = scope.compiler.class_scope(self)
43: Puppet.debug "Class '%s' already evaluated; not evaluating again" % (classname == "" ? "main" : classname)
44: return nil
45: end
46:
47: pnames = nil
48: if pklass = self.parentobj
49: parent_resource = resource.scope.compiler.catalog.resource(self.class.name, pklass.classname)
50: # This shouldn't evaluate if the class has already been evaluated.
51: pklass.evaluate_code(parent_resource)
52:
53: scope = parent_scope(scope, pklass)
54: pnames = scope.namespaces
55: end
56:
57: # Don't create a subscope for the top-level class, since it already
58: # has its own scope.
59: scope = subscope(scope, resource) unless resource.title == :main
60:
61: # Add the parent scope namespaces to our own.
62: if pnames
63: pnames.each do |ns|
64: scope.add_namespace(ns)
65: end
66: end
67:
68: # Set the class before we evaluate the code, so that it's set during
69: # the evaluation and can be inspected.
70: scope.compiler.class_set(self.classname, scope)
71:
72: # Now evaluate our code, yo.
73: if self.code
74: return self.code.safeevaluate(scope)
75: else
76: return nil
77: end
78: end