summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/puppet/parser/functions.rb12
-rw-r--r--lib/puppet/parser/scope.rb13
2 files changed, 22 insertions, 3 deletions
diff --git a/lib/puppet/parser/functions.rb b/lib/puppet/parser/functions.rb
index 38bb2eb42..4179cb81d 100644
--- a/lib/puppet/parser/functions.rb
+++ b/lib/puppet/parser/functions.rb
@@ -2,10 +2,12 @@ require 'puppet/util/autoload'
require 'puppet/parser/scope'
# A module for managing parser functions. Each specified function
-# becomes an instance method on the Scope class.
+# is added to a central module that then gets included into the Scope
+# class.
module Puppet::Parser::Functions
@functions = {}
+ @modules = {}
class << self
include Puppet::Util
@@ -22,6 +24,10 @@ module Puppet::Parser::Functions
@autoloader
end
+ def self.environment_module(env = nil)
+ @module ||= Module.new
+ end
+
# Create a new function type.
def self.newfunction(name, options = {}, &block)
name = symbolize(name)
@@ -43,7 +49,7 @@ module Puppet::Parser::Functions
end
fname = "function_" + name.to_s
- Puppet::Parser::Scope.send(:define_method, fname, &block)
+ environment_module.send(:define_method, fname, &block)
# Someday we'll support specifying an arity, but for now, nope
#@functions[name] = {:arity => arity, :type => ftype}
@@ -64,7 +70,7 @@ module Puppet::Parser::Functions
@functions.delete(name)
fname = "function_" + name.to_s
- Puppet::Parser::Scope.send(:remove_method, fname)
+ environment_module.send(:remove_method, fname)
end
# Determine if a given name is a function
diff --git a/lib/puppet/parser/scope.rb b/lib/puppet/parser/scope.rb
index 19d79e6d0..991e12302 100644
--- a/lib/puppet/parser/scope.rb
+++ b/lib/puppet/parser/scope.rb
@@ -105,6 +105,11 @@ class Puppet::Parser::Scope
end
end
+ # Remove this when rebasing
+ def environment
+ compiler.environment
+ end
+
# Are we the top scope?
def topscope?
@level == 1
@@ -141,6 +146,8 @@ class Puppet::Parser::Scope
end
}
+ extend_with_functions_module()
+
@tags = []
# The symbol table for this scope. This is where we store variables.
@@ -494,4 +501,10 @@ class Puppet::Parser::Scope
setvar("#{i+1}", m, :file => file, :line => line, :ephemeral => true)
end
end
+
+ private
+
+ def extend_with_functions_module
+ extend Puppet::Parser::Functions.environment_module(compiler ? environment : nil)
+ end
end