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.

Methods

Public Instance methods

Are we a child of the passed class? Do a recursive search up our parentage tree to figure it out.

[Source]

    # 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.

[Source]

    # 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.

[Source]

    # 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

[Source]

    # File lib/puppet/parser/ast/hostclass.rb, line 80
80:     def parent_scope(scope, klass)
81:         if s = scope.compiler.class_scope(klass)
82:             return s
83:         else
84:             raise Puppet::DevError, "Could not find scope for %s" % klass.classname
85:         end
86:     end

[Validate]