Imagine how much simpler everyone's life would be if OpenEdge / whatever ran source through the preprocessor before scanning annotations.

Example 1:

@openapi.openedge.export(type="REST", useReturnValue="false", writeDataSetBeforeImage="true").
@progress.service.resourceMapping(type="REST", operation="create", URI="", alias="", mediaType="application/json").
method public void create ( input-output dataset {&DatasetName} ):

/* Validate Stuff */
this-object:CreateData ( dataset {&DatasetName} by-reference ).

this-object:saveTTDataSource ( jsonDB, temp-table srctt{&TableName}:handle ).

end method /* create */.

Example 2:

&global-define TableName customer

&global-define ClassName {&TableName}BE

&global-define SchemaName ds{&TableName} 

&global-define SchemaPath /path/to/schemas

&global-define ServiceName MyService

@openapi.openedge.export FILE(type="REST", executionMode="singleton", useReturnValue="false", writeDataSetBeforeImage="false").
@progress.service.resource FILE(name="{&ClassName}", URI="/{&ClassName}", schemaName="{&SchemaName}", schemaFile="{&ServiceName}/{SchemaPath}/{&SchemaName}.i").