O gerador toma, como entrada, além da hierarquia original, código adicional que modifica a interface de cada classe de envelope, dependendo dos módulos funcionais que o programador da aplicação queira utilizar.
A classe Envelope, não está imune às modificações a introduzir, porque algumas delas podem ser suficientemente genéricas para não ser útil replicá-las em cada classe.
O código adicional prepara a interface por forma a que possa ser utilizada a partir do nível de suporte e, especialmente, na interacção com gestores de módulos. Além da interface, é também possível modificar a geração de cada método do envelope que tenha sido gerado a partir da hierarquia original. Como consequência, o envelope pode também passar a poder interagir directamente com o nível de suporte do módulo que provocou a introdução da modificação, e.g. no módulo de distribuição, o envelope pode passar a poder redirigir invocações para outros objectos que não a carta.
Cabe ao programador de cada módulo especificar o código a adicionar aos envelopes, sob o formato aceite pelo gerador de envelopes. A forma de realizar a operação é através do fornecimento ao gerador de informação por ele utilizável em tempo de execução. A alternativa de modificar o próprio gerador, embora possível, não é das mais elegantes.
O código adicional pode ser incluído sob uma das seguintes formas:
SPM_quot
BEFORE_BODY" descreve esta acção.
SPM_quot
AFTER_BODY" descreve esta acção. Se o método
retornar alguma coisa, esta operação é introduzida imediatamente
antes da instrução de retorno.
SPM_quot
REPLACE_BODY" descreve esta acção. O novo
corpo deve estar completamente delimitado.
SPM_quot
MONO_DECL" e SPM_quot
MONO_IMPL"
descrevem, respectivamente, a declaração da interface e o corpo do
novo método.
SPM_quot
MULT_DECL" e SPM_quot
MULT_IMPL" descrevem, respectivamente, a
declaração da interface e o corpo do novo método.
SPM_quot
MONO_DECL",
para modificar uma classe, ou SPM_quot
MULT_DECL" para todas as
classes.
A figura 4.2 mostra a posição dos blocos de código inseridos pela acção de cada directiva. A figura mostra também um pequeno exemplo de código resultante da actuação das ferramentas. O exemplo utiliza C++ e é bastante simplista, ignorando muitos dos problemas que na realidade existem.
Figure 4.2: Blocos de codigo adicional.
Cada uma das modificações pode ser parametrizada de várias formas:
pela classe e pelo método a serem modificados. Assim, SPM_quot
type"
representa o nome da classe que está a ser processada; SPM_quot
method" é
o nome do método que está a ser processado; SPM_quot
args" é a lista de
argumentos do método, tal como apareceria numa invocação de um método
da classe, podendo ser nula; SPM_quot
letter" representa a variável que
referencia a carta; a variável indicada por SPM_quot
result" é retornada
no fim da execução do método, se for caso disso. O
capítulo 6 mostra a concretização das directivas para
C++. Note-se que, nesta versão não são suportadas listas de argumentos
de dimensão variável ( varargs em C/C++).
É da responsabilidade do programador de serviços preparar os módulos funcionais para serem utilizados pelos envelopes e para que estes possam ser por eles contactados de forma útil, ou seja, deve ser o programador dos módulos a garantir o correcto funcionamento da interacção entre os níveis de ligação e suporte. A especificação da forma de comunicação e controlo pode corresponder à inclusão de métodos e/ou variáveis de instância nos envelopes, assim como código adicional em cada método já existente, em cada classe de envelope. Veja-se, como exemplo, o caso do módulo de distribuição (secção 5.1), onde ocorrem os três tipos de alterações.