Class: Async::Service::Environment::Evaluator

Inherits:
Object
  • Object
show all
Defined in:
lib/async/service/environment.rb

Overview

An evaluator is lazy read-only view of an environment. It memoizes all method calls.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeEvaluator

Initialize a new evaluator.



179
180
181
# File 'lib/async/service/environment.rb', line 179

def initialize
	@cache = {}
end

Class Method Details

.wrap(environment) ⇒ Object

Create an evaluator wrapper for an environment.



148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'lib/async/service/environment.rb', line 148

def self.wrap(environment)
	evaluator = ::Class.new(self)
	
	facet = ::Module.new
	environment.included(facet)
	
	evaluator.include(facet)
	
	keys = []
	
	# Memoize all instance methods:
	facet.instance_methods.each do |name|
		instance_method = facet.instance_method(name)
		
		# Only memoize methods with no arguments:
		if instance_method.arity == 0
			keys << name
			
			evaluator.define_method(name) do
				@cache[name] ||= super()
			end
		end
	end
	
	# This lists all zero-argument methods:
	evaluator.define_method(:keys) {keys}
	
	return evaluator.new
end

Instance Method Details

#[](key) ⇒ Object

Get value for a given key.



210
211
212
213
214
# File 'lib/async/service/environment.rb', line 210

def [](key)
	if self.key?(key)
		self.__send__(key)
	end
end

#inspectObject

Inspect representation of the evaluator.



185
186
187
# File 'lib/async/service/environment.rb', line 185

def inspect
	"#<#{Evaluator} #{self.keys}>"
end

#key?(key) ⇒ Boolean

Check if a key is available.

Returns:

  • (Boolean)


219
220
221
# File 'lib/async/service/environment.rb', line 219

def key?(key)
	self.keys.include?(key)
end

#to_hObject

Convert the evaluator to a hash.



191
192
193
194
195
196
197
198
# File 'lib/async/service/environment.rb', line 191

def to_h
	# Ensure all keys are evaluated:
	self.keys.each do |name|
		self.__send__(name)
	end
	
	return @cache
end

#to_jsonObject

Convert the evaluator to JSON.



203
204
205
# File 'lib/async/service/environment.rb', line 203

def to_json(...)
	self.to_h.to_json(...)
end