@@ -15,6 +15,8 @@ def self.define(*symbols, &)
1515 data_class = Class . new {
1616 self . define_singleton_method ( :members ) { members }
1717
18+ define_method ( :members ) { self . class . members }
19+
1820 define_method ( :initialize ) do |*values , **kwargs |
1921 local_members = members
2022 if kwargs && !kwargs . empty?
@@ -53,9 +55,30 @@ def self.define(*symbols, &)
5355 nil
5456 end
5557
56- define_method ( :to_h ) do
58+ alias _original_inspect_ inspect
59+ define_method ( :inspect ) do
60+ # We implement this using Ruby and our inspect output shows the @ for the member fields.
61+ # Without exposing some very internal methods using JRuby.reference we cannot generate this
62+ # naturally so we will post-process the output.
63+ _original_inspect_ . tap do |original_inspect |
64+ original_inspect . gsub! /@([^=]+=)/ , '\1'
65+ end
66+ end
67+
68+ define_method ( :to_h ) do |&blk |
5769 hash = Hash . new . compare_by_identity
58- members . each { |member | hash [ member ] = instance_variable_get ( :"@#{ member } " ) }
70+
71+ if blk
72+ members . each do |member |
73+ result = blk . call member , instance_variable_get ( :"@#{ member } " )
74+ ary = Array . try_convert result
75+ raise TypeError . new ( "wrong element type #{ result . class } " ) unless ary
76+ raise ArgumentError . new ( "element has wrong array length (expected 2, was #{ ary . size } )" ) if ary . size != 2
77+ hash . []=( *ary )
78+ end
79+ else
80+ members . each { |member | hash [ member ] = instance_variable_get ( :"@#{ member } " ) }
81+ end
5982 hash
6083 end
6184
0 commit comments