Class: Skiima::Config::Struct

Inherits:
OpenStruct
  • Object
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_hashObject



67
68
69
# File 'lib/skiima/config/struct.rb', line 67

def to_hash
  @table
end