From aba5c5513c8726b8e5da5da6eedf0f0e0d998e84 Mon Sep 17 00:00:00 2001 From: Norbert Hartl Date: Tue, 13 Oct 2026 14:38:39 +0200 Subject: [PATCH] Let a variable segment resolve to several classes HOPVariableSegment>>resolveClasses: takes a collection of classes whose instances live at the segment, for resources without a common superclass. The instance map and the presenters are the union over them, a presenter shared by two classes is registered once. resolveClass: stays as the short form for one class. Co-Authored-By: Claude Opus 5.5 --- source/HOP-Core-Tests/HOPSegmentTest.class.st | 22 ++++++++++++++++ source/HOP-Core/HOPVariableSegment.class.st | 25 +++++++++++++------ 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/source/HOP-Core-Tests/HOPSegmentTest.class.st b/source/HOP-Core-Tests/HOPSegmentTest.class.st index 39a6c7d..7b07aa4 100644 --- a/source/HOP-Core-Tests/HOPSegmentTest.class.st +++ b/source/HOP-Core-Tests/HOPSegmentTest.class.st @@ -5,3 +5,25 @@ Class { #package : 'HOP-Core-Tests', #tag : 'Tests' } + +{ #category : 'tests' } +HOPSegmentTest >> testResolveClassIsShortForOneClass [ + + | segment | + segment := HOPVariableSegment new resolveClass: HOPUriSpaceTestClass1. + self assert: segment resolveClasses equals: { HOPUriSpaceTestClass1 }. + self + assertCollection: segment instanceMapClasses + hasSameElements: HOPUriSpaceTestClass1 hopExposedClasses +] + +{ #category : 'tests' } +HOPSegmentTest >> testResolveClassesExposesEveryClass [ + + | segment | + segment := HOPVariableSegment new resolveClasses: { + HOPUriSpaceTestClass1. + HOPUriSpaceTestClass2 }. + self assert: (segment instanceMapClasses includes: HOPUriSpaceTestClass1). + self assert: (segment instanceMapClasses includes: HOPUriSpaceTestClass2) +] diff --git a/source/HOP-Core/HOPVariableSegment.class.st b/source/HOP-Core/HOPVariableSegment.class.st index 36504c6..8aa7fbf 100644 --- a/source/HOP-Core/HOPVariableSegment.class.st +++ b/source/HOP-Core/HOPVariableSegment.class.st @@ -4,7 +4,7 @@ Class { #instVars : [ 'canonical', 'resourceRouteSelector', - 'resourceClass', + 'resourceClasses', 'segmentNameSelector', 'containerSelector' ], @@ -83,8 +83,8 @@ HOPVariableSegment >> initializePresenter [ { #category : 'accessing' } HOPVariableSegment >> instanceMapClasses [ - resourceClass ifNil: [ ^ nil ]. - ^ resourceClass hopExposedClasses + resourceClasses ifNil: [ ^ nil ]. + ^ resourceClasses flatCollect: [ :each | each hopExposedClasses ] ] { #category : 'testing' } @@ -122,8 +122,9 @@ HOPVariableSegment >> nodeLabel [ { #category : 'accessing' } HOPVariableSegment >> presenterClasses [ + "the classes resolved here may share presenters, each is registered once" - ^ resourceClass presenterClasses + ^ (resourceClasses flatCollect: [ :each | each presenterClasses ]) asOrderedCollection removeDuplicates ] { #category : 'accessing' } @@ -132,15 +133,23 @@ HOPVariableSegment >> priority [ ] { #category : 'accessing' } -HOPVariableSegment >> resolveClass [ +HOPVariableSegment >> resolveClass: aClass [ + "short form for a segment that resolves to the instances of one class" - ^ resourceClass + self resolveClasses: { aClass } ] { #category : 'accessing' } -HOPVariableSegment >> resolveClass: anObject [ +HOPVariableSegment >> resolveClasses [ - resourceClass := anObject + ^ resourceClasses +] + +{ #category : 'accessing' } +HOPVariableSegment >> resolveClasses: aCollectionOfClasses [ + "the instances at this segment may be of classes without a common superclass" + + resourceClasses := aCollectionOfClasses ] { #category : 'as yet unclassified' }