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 |
Norbert,
On 26 Sep 2013, at 11:32, Norbert Hartl <[hidden email]> 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 |
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 <[hidden email]> wrote: Norbert, |
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 ... Phil On Mon, Mar 17, 2014 at 5:40 PM, [hidden email] <[hidden email]> wrote:
|
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, [hidden email] 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, [hidden email] <[hidden email]> 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 <[hidden email]> wrote: > Norbert, > > On 26 Sep 2013, at 11:32, Norbert Hartl <[hidden email]> 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 > > > |
Super! On Sat, Mar 22, 2014 at 11:15 AM, Sven Van Caekenberghe <[hidden email]> wrote: Phil, |
Free forum by Nabble | Edit this page |