summaryrefslogtreecommitdiff
path: root/lib/ostruct.rb
diff options
context:
space:
mode:
authorMarc-Andre Lafortune <github@marc-andre.ca>2020-09-08 16:13:15 -0400
committerMarc-Andre Lafortune <github@marc-andre.ca>2020-09-14 12:46:45 -0400
commitebb8de730269a8c18a553e3dea7a7603b13d2328 (patch)
tree2e576cda62114bcb0d53b9d9e5dd5314240b57f9 /lib/ostruct.rb
parent5e7ec0531987bfff65f65db9d491c272abb4add1 (diff)
[ruby/ostruct] Refactor handling of frozen OpenStruct. Simplify `new_ostruct_member!`
Diffstat (limited to 'lib/ostruct.rb')
-rw-r--r--lib/ostruct.rb33
1 files changed, 11 insertions, 22 deletions
diff --git a/lib/ostruct.rb b/lib/ostruct.rb
index 477b67c0d5..18850bfafb 100644
--- a/lib/ostruct.rb
+++ b/lib/ostruct.rb
@@ -93,9 +93,7 @@ class OpenStruct
@table = {}
if hash
hash.each_pair do |k, v|
- k = k.to_sym
- @table[k] = v
- new_ostruct_member!(k)
+ self[k] = v
end
end
end
@@ -166,41 +164,30 @@ class OpenStruct
end
#
- # Used internally to check if the OpenStruct is able to be
- # modified before granting access to the internal Hash table to be modified.
- #
- def modifiable? # :nodoc:
- begin
- @modifiable = true
- rescue
- raise FrozenError, "can't modify frozen #{self.class}", caller(3)
- end
- @table
- end
- private :modifiable?
-
- #
# Used internally to defined properties on the
# OpenStruct. It does this by using the metaprogramming function
# define_singleton_method for both the getter method and the setter method.
#
def new_ostruct_member!(name) # :nodoc:
- name = name.to_sym
unless respond_to?(name)
define_singleton_method(name) { @table[name] }
- define_singleton_method("#{name}=") {|x| modifiable?[name] = x}
+ define_singleton_method("#{name}=") {|x| @table[name] = x}
end
- name
end
private :new_ostruct_member!
+ def freeze
+ @table.freeze
+ super
+ end
+
def method_missing(mid, *args) # :nodoc:
len = args.length
if mname = mid[/.*(?==\z)/m]
if len != 1
raise ArgumentError, "wrong number of arguments (given #{len}, expected 1)", caller(1)
end
- modifiable?[new_ostruct_member!(mname)] = args[0]
+ self[mname]= args[0]
elsif len == 0
elsif @table.key?(mid)
raise ArgumentError, "wrong number of arguments (given #{len}, expected 0)"
@@ -240,7 +227,9 @@ class OpenStruct
# person.age # => 42
#
def []=(name, value)
- modifiable?[new_ostruct_member!(name)] = value
+ name = name.to_sym
+ new_ostruct_member!(name)
+ @table[name] = value
end
# :call-seq: