Class: Utopia::Controller::Variables
- Inherits:
-
Object
- Object
- Utopia::Controller::Variables
- Defined in:
- lib/utopia/controller/variables.rb
Overview
Provides a stack-based instance variable lookup mechanism. It can flatten a stack of controllers into a single hash.
Instance Method Summary collapse
-
#<<(controller) ⇒ Object
-
#[](key) ⇒ Object
-
#fetch(key, default = self) ⇒ Object
We use self as a seninel.
-
#initialize ⇒ Variables
constructor
A new instance of Variables.
-
#to_hash ⇒ Object
-
#top ⇒ Object
Constructor Details
#initialize ⇒ Variables
Returns a new instance of Variables
25 26 27 |
# File 'lib/utopia/controller/variables.rb', line 25 def initialize @controllers = [] end |
Instance Method Details
#<<(controller) ⇒ Object
33 34 35 36 37 38 39 40 41 42 |
# File 'lib/utopia/controller/variables.rb', line 33 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 |
#[](key) ⇒ Object
75 76 77 |
# File 'lib/utopia/controller/variables.rb', line 75 def [] key fetch("@#{key}".to_sym, nil) end |
#fetch(key, default = self) ⇒ Object
We use self as a seninel
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/utopia/controller/variables.rb', line 45 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 |
#to_hash ⇒ Object
61 62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/utopia/controller/variables.rb', line 61 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 |
#top ⇒ Object
29 30 31 |
# File 'lib/utopia/controller/variables.rb', line 29 def top @controllers.last end |