@@ -72,23 +72,10 @@ def fields
72
72
# @return [void]
73
73
def add_field ( field_defn )
74
74
own_fields [ field_defn . name ] = field_defn
75
- # Add a `super` method for implementing this field:
76
- field_key = field_defn . name . inspect
77
- default_resolve_module = self . instance_variable_get ( :@_default_resolve )
78
- if default_resolve_module . nil?
79
- # This should have been set up in one of the inherited or included hooks above,
80
- # if it wasn't, it's because those hooks weren't called because `super` wasn't present.
81
- raise <<-ERR
82
- Uh oh! #{ self } doesn't have a default resolve module. This probably means that an `inherited` hook didn't call super.
83
- Check `inherited` on #{ self } 's superclasses.
84
- ERR
75
+ if !method_defined? ( field_defn . method_sym )
76
+ # Only add the super method if there isn't one already.
77
+ add_super_method ( field_defn . name , field_defn . method_sym )
85
78
end
86
- default_resolve_module . module_eval <<-RUBY , __FILE__ , __LINE__ + 1
87
- def #{ field_defn . method_sym } (**args)
88
- field_inst = self.class.fields[#{ field_key } ] || raise(%|Failed to find field #{ field_key } for \# {self.class} among \# {self.class.fields.keys}|)
89
- field_inst.resolve_field_method(self, args, context)
90
- end
91
- RUBY
92
79
nil
93
80
end
94
81
@@ -122,6 +109,28 @@ def build_field(*args, **kwargs, &block)
122
109
kwargs [ :owner ] = self
123
110
field_class . new ( *args , **kwargs , &block )
124
111
end
112
+
113
+ # Find the magic module for holding super methods,
114
+ # and add a field named `method_name` for implementing the field
115
+ # called `field_name`.
116
+ # It will be the `super` method if the method is overwritten in the class definition.
117
+ def add_super_method ( field_key , method_name )
118
+ default_resolve_module = @_default_resolve
119
+ if default_resolve_module . nil?
120
+ # This should have been set up in one of the inherited or included hooks above,
121
+ # if it wasn't, it's because those hooks weren't called because `super` wasn't present.
122
+ raise <<-ERR
123
+ Uh oh! #{ self } doesn't have a default resolve module. This probably means that an `inherited` hook didn't call super.
124
+ Check `inherited` on #{ self } 's superclasses.
125
+ ERR
126
+ end
127
+ default_resolve_module . module_eval <<-RUBY , __FILE__ , __LINE__ + 1
128
+ def #{ method_name } (**args)
129
+ field_inst = self.class.fields[#{ field_key } ] || raise(%|Failed to find field #{ field_key } for \# {self.class} among \# {self.class.fields.keys}|)
130
+ field_inst.resolve_field_method(self, args, context)
131
+ end
132
+ RUBY
133
+ end
125
134
end
126
135
end
127
136
end
0 commit comments