Class: Skiima::Config::Struct
- Inherits:
-
OpenStruct
- Object
- OpenStruct
- Skiima::Config::Struct
show all
- Defined in:
- lib/skiima/config/struct.rb
Instance Method Summary
collapse
Constructor Details
#initialize(opts = {}) ⇒ Struct
Returns a new instance of Struct.
5
6
7
8
|
# File 'lib/skiima/config/struct.rb', line 5
def initialize(opts = {})
@table = Skiima.symbolize_keys(opts)
@table.each_key { |k,v| new_ostruct_member(k) }
end
|
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(mid, *args, &block) ⇒ Object
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
# File 'lib/skiima/config/struct.rb', line 31
def method_missing(mid, *args, &block)
mname, len = mid.id2name, args.length
case
when (mname.chomp!('=') && (mid != :[]=))
raise_argument_error(len, caller(1)) if len != 1
modifiable[new_ostruct_member(mname)] = args[0]
when (len == 0 && (mid != :[]) && block_given?)
cs = self.class.new(Hash.new).ostruct_eval(&block)
modifiable[new_ostruct_member(mname)] = cs
when (len == 0 && mid != :[])
@table[mid]
when (len == 1 && mid != :[])
modifiable[new_ostruct_member(mname)] = args[0]
else raise_no_method_error(mid, caller(1))
end
end
|
Instance Method Details
#[](key) ⇒ Object
50
51
52
|
# File 'lib/skiima/config/struct.rb', line 50
def [](key)
@table[key]
end
|
#[]=(key, val) ⇒ Object
54
55
56
|
# File 'lib/skiima/config/struct.rb', line 54
def []=(key,val)
modifiable[key] = val
end
|
#convert_key(key) ⇒ Object
71
72
73
|
# File 'lib/skiima/config/struct.rb', line 71
def convert_key(key)
key.kind_of?(Symbol) ? key : (key.to_sym rescue key)
end
|
#merge(hash) ⇒ Object
62
63
64
65
|
# File 'lib/skiima/config/struct.rb', line 62
def merge(hash)
hash.each { |k,v| self[k] = v; new_ostruct_member(k) unless self.respond_to? k }
self
end
|
#new_ostruct_member(name) ⇒ Object
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
# File 'lib/skiima/config/struct.rb', line 10
def new_ostruct_member(name)
name = convert_key(name)
unless self.respond_to?(name)
self.instance_eval <<EOS
def #{name.to_s}
v = @table[:#{name.to_s}]
if v.is_a?(Hash)
self.class.new(v)
else
v
end
end
def #{name.to_s}=(x)
modifiable[:#{name.to_s}] = x
end
EOS
end
name
end
|
#slice(*keys) ⇒ Object
58
59
60
|
# File 'lib/skiima/config/struct.rb', line 58
def slice(*keys)
keys.inject(Hash.new) { |m,k| m[k] = @table[k] if @table.key?(k); m }
end
|
#to_hash ⇒ Object
67
68
69
|
# File 'lib/skiima/config/struct.rb', line 67
def to_hash
@table
end
|