Sha256: 2a113a95c48efb324be005a1258dd618fff1149cc07cfbf2a941e4a11a364057

Contents?: true

Size: 1.33 KB

Versions: 9

Compression:

Stored size: 1.33 KB

Contents

# frozen_string_literal: true

# Released under the MIT License.
# Copyright, 2014-2022, by Samuel Williams.

module Utopia
	class Controller
		# Provides a stack-based instance variable lookup mechanism. It can flatten a stack of controllers into a single hash.
		class Variables
			def initialize
				@controllers = []
			end
			
			def top
				@controllers.last
			end

			def << controller
				if top = self.top
					# This ensures that most variables will be at the top and controllers can naturally interactive with instance variables:
					controller.copy_instance_variables(top)
				end
				
				@controllers << controller
				
				return self
			end
			
			# We use self as a seninel
			def fetch(key, default=self)
				if controller = self.top
					if controller.instance_variables.include?(key)
						return controller.instance_variable_get(key)
					end
				end
				
				if block_given?
					yield(key)
				elsif !default.equal?(self)
					return default
				else
					raise KeyError.new(key)
				end
			end

			def to_hash
				attributes = {}
				
				if controller = self.top
					controller.instance_variables.each do |name|
						key = name[1..-1].to_sym
						
						attributes[key] = controller.instance_variable_get(name)
					end
				end
				
				return attributes
			end

			def [] key
				fetch("@#{key}".to_sym, nil)
			end
		end
	end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
utopia-2.25.0 lib/utopia/controller/variables.rb
utopia-2.24.4 lib/utopia/controller/variables.rb
utopia-2.24.3 lib/utopia/controller/variables.rb
utopia-2.24.1 lib/utopia/controller/variables.rb
utopia-2.23.0 lib/utopia/controller/variables.rb
utopia-2.22.2 lib/utopia/controller/variables.rb
utopia-2.22.1 lib/utopia/controller/variables.rb
utopia-2.22.0 lib/utopia/controller/variables.rb
utopia-2.21.0 lib/utopia/controller/variables.rb