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.
10 11 12 |
# File 'lib/utopia/controller/variables.rb', line 10 def initialize @controllers = [] end |
Instance Method Details
#<<(controller) ⇒ Object
18 19 20 21 22 23 24 25 26 27 |
# File 'lib/utopia/controller/variables.rb', line 18 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
60 61 62 |
# File 'lib/utopia/controller/variables.rb', line 60 def [] key fetch("@#{key}".to_sym, nil) end |
#fetch(key, default = self) ⇒ Object
We use self as a seninel
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/utopia/controller/variables.rb', line 30 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
46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/utopia/controller/variables.rb', line 46 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
14 15 16 |
# File 'lib/utopia/controller/variables.rb', line 14 def top @controllers.last end |