38 lines
		
	
	
		
			721 B
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			38 lines
		
	
	
		
			721 B
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|   | class Hbc::DSL::StanzaProxy | ||
|  |   attr_reader :type | ||
|  | 
 | ||
|  |   def self.once(type) | ||
|  |     resolved = nil | ||
|  |     new(type) { resolved ||= yield } | ||
|  |   end | ||
|  | 
 | ||
|  |   def initialize(type, &resolver) | ||
|  |     @type = type | ||
|  |     @resolver = resolver | ||
|  |   end | ||
|  | 
 | ||
|  |   def proxy? | ||
|  |     true | ||
|  |   end | ||
|  | 
 | ||
|  |   def to_s | ||
|  |     @resolver.call.to_s | ||
|  |   end | ||
|  | 
 | ||
|  |   # Serialization for dumpcask | ||
|  |   def encode_with(coder) | ||
|  |     coder["type"] = type | ||
|  |     coder["resolved"] = @resolver.call | ||
|  |   end | ||
|  | 
 | ||
|  |   def respond_to?(symbol, include_private = false) | ||
|  |     return true if %i{encode_with proxy? to_s type}.include?(symbol) | ||
|  |     return false if symbol == :to_ary | ||
|  |     @resolver.call.respond_to?(symbol, include_private) | ||
|  |   end | ||
|  | 
 | ||
|  |   def method_missing(symbol, *args) | ||
|  |     @resolver.call.send(symbol, *args) | ||
|  |   end | ||
|  | end |