The "super" thing doesn't work. I have spent a while tracing what was occuring with the custom mappings. If in a subclass I do: neoJsonMapping: aMapper super neoJsonMapping: aMapper. aMapper for: self do: [ :mapping | mapping mapProperty: 'startDate' getter: [ :filter | filter startDate ] setter: [ :filter :value | filter startDate: value ]; mapProperty: 'endDate' getter: [ :filter | filter endDate ] setter: [ :filter :value | filter endDate: value ]. ] and in the superclass: neoJsonMapping: aMapper aMapper for: self do: [ :mapping | mapping mapInstVar: #id to: 'id'. ] (do not pay attention to mapInstVar or mapProperty, I was figuring out how things worked). Thing is that the mapping goes fine up to one point. super neoJsonMapping: aMapper indeed puts the right 'id' mapping but then aMapper for:: self do: [ ... does for: smalltalkClass do: block "Create and add a new standard object mapping for smalltalkClass. The code in block should further customize the mapping." | mapping | mapping := self newObjectMappingFor: smalltalkClass. block value: mapping. ^ mapping which in turn: newObjectMappingFor: smalltalkClass | mapping | mapping := NeoJSONObjectMapping new. mapping subjectClass: smalltalkClass. self mappings at: smalltalkClass put: mapping. ^ mapping Argh: self mappings at: smalltalkClass put: mapping. Overwrites the existing contents. So, only the entries of the subclass are left. I guess that's a bug. I'd do: newObjectMappingFor: smalltalkClass | mapping | mapping := self mappings at: smalltalkClass. mapping ifNil: [ mapping := NeoJSONObjectMapping new. mapping subjectClass: smalltalkClass. self mappings at: smalltalkClass put: mapping. ]. ^ mapping instead. Does this look right? mapping := self newObjectMappingFor: smalltalkClass. isn't then really intention revealing. Shouldn't we rename that to objectMappingFor: smalltalkClass Phil On Fri, Sep 27, 2013 at 7:07 PM, Sven Van Caekenberghe <sven@stfx.eu> wrote:
Norbert,
On 26 Sep 2013, at 11:32, Norbert Hartl <norbert@hartl.name> wrote:
How is inheritance supposed to work in NeoJSON? I only figured it out by doing that manually:
neoJsonMapping: aMapper super neoJsonMapping: aMapper. (aMapper mappingFor: self) mapInstVar: #longitude; mapInstVar: #latitude.
Is there a better way to do?
Norbert
What you figured out yourself is the only inheritance that is available.
The thing is, schema names (which can be plain Symbols or Class objects) are meant to be used for things like #ArrayOfPoints, #DictionaryWithUserValues which tell something about subtypes. I hurts to think of an inheritance for that ;-)
Sven