Phil, I finally found time to look in to this in detail and added a test with inheritance.
In #bleedingEdge: === Name: Neo-JSON-Core-SvenVanCaekenberghe.25 Author: SvenVanCaekenberghe Time: 22 March 2014, 11:03:31.510538 am UUID: 3051cd7d-a857-4aee-b5ba-d56a4085517b Ancestors: Neo-JSON-Core-SvenVanCaekenberghe.24 Added basic support for mapping using inheritance when using #neoJonMapping : (see #testObject3) Renamed #new[Custom|Object]MappingFor: to [custom|object]MappingFor: to better reflect the new behavior Thanks Philippe Back for making these suggestions! === Name: Neo-JSON-Tests-SvenVanCaekenberghe.23 Author: SvenVanCaekenberghe Time: 22 March 2014, 11:04:11.513921 am UUID: 27fad240-c6b9-4d00-a4e6-6e49fd612dfb Ancestors: Neo-JSON-Tests-SvenVanCaekenberghe.22 Added basic support for mapping using inheritance when using #neoJonMapping : (see #testObject3) Renamed #new[Custom|Object]MappingFor: to [custom|object]MappingFor: to better reflect the new behavior Thanks Philippe Back for making these suggestions! === On 17 Mar 2014, at 18:01, [email protected] wrote: > NeoJSONMapper>>newObjectMappingFor: smalltalkClass > | mapping | > > mapping := self mappings at: smalltalkClass ifAbsent: [ > mapping := NeoJSONObjectMapping new. > mapping subjectClass: smalltalkClass. > self mappings at: smalltalkClass put: mapping. > ]. > > ^ mapping > > > works better ... #at:ifAbsentPut: is even better ;-) Regards, Sven > Phil > > On Mon, Mar 17, 2014 at 5:40 PM, [email protected] <[email protected]> > wrote: > 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 <[email protected]> wrote: > Norbert, > > On 26 Sep 2013, at 11:32, Norbert Hartl <[email protected]> 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 > > >
