Skip to content

Commit f9f4888

Browse files
committed
Fix up David Feldman's PR to work better than my online editor attempt at resolving merge conflicts
1 parent 99cab53 commit f9f4888

File tree

2 files changed

+14
-18
lines changed

2 files changed

+14
-18
lines changed

lib/recursive_open_struct.rb

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,10 @@ def [](name)
7070
end
7171

7272
def []=(name, value)
73-
modifiable do |tbl|
74-
key_name = _get_key_from_table_(name)
75-
@sub_elements.delete(key_name)
76-
tbl[key_name] = value
77-
end
73+
key_name = _get_key_from_table_(name)
74+
tbl = modifiable? # Ensure we are modifiable
75+
@sub_elements.delete(key_name)
76+
tbl[key_name] = value
7877
end
7978

8079
# Makes sure ROS responds as expected on #respond_to? and #method requests
@@ -102,13 +101,16 @@ def method_missing(mid, *args)
102101
if len != 1
103102
raise ArgumentError, "wrong number of arguments (#{len} for 1)", caller(1)
104103
end
105-
modifiable?[new_ostruct_member!($1.to_sym)] = args[0]
104+
# self[$1.to_sym] = args[0]
105+
# modifiable?[new_ostruct_member!($1.to_sym)] = args[0]
106+
new_ostruct_member!($1.to_sym)
107+
public_send(mid, args[0])
106108
elsif len == 0
107109
key = mid
108110
key = $1 if key =~ /^(.*)_as_a_hash$/
109111
if @table.key?(_get_key_from_table_(key))
110112
new_ostruct_member!(key)
111-
send(mid)
113+
public_send(mid)
112114
end
113115
else
114116
err = NoMethodError.new "undefined method `#{mid}' for #{self}", mid, args
@@ -127,8 +129,7 @@ class << self; self; end.class_eval do
127129
self[key_name]
128130
end
129131
define_method("#{name}=") do |x|
130-
@sub_elements.delete(key_name)
131-
modifiable?[key_name] = x
132+
self[key_name] = x
132133
end
133134
define_method("#{name}_as_a_hash") { @table[key_name] }
134135
end
@@ -148,15 +149,8 @@ class << self; self; end.class_eval do
148149
def delete_field(name)
149150
sym = _get_key_from_table_(name)
150151
singleton_class.__send__(:remove_method, sym, "#{sym}=") rescue NoMethodError # ignore if methods not yet generated.
151-
@sub_elements.delete sym
152-
@table.delete sym
153-
end
154-
155-
protected
156-
157-
# TODO: Use modifiable? instead of modifiable once we care less about Rubies before 2.4.0.
158-
def modifiable
159-
block_given? ? yield(super) : super
152+
@sub_elements.delete(sym)
153+
@table.delete(sym)
160154
end
161155

162156
private

spec/recursive_open_struct/recursion_spec.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@
3131
it "handles sub-element replacement with dotted notation before member setup" do
3232
expect(ros[:blah][:another]).to eql 'value'
3333
expect(ros.methods).not_to include(:blah)
34+
3435
ros.blah = { changed: 'backing' }
36+
3537
expect(ros.blah.changed).to eql 'backing'
3638
end
3739

0 commit comments

Comments
 (0)