Listing 1

// An operation done via a command line
class CommandLineOperation
{
public:
  void Execute()
  {
    inParameters.SubstituteParametersInCommandLine(commandLine);
    outParameters.SubstituteParametersInCommandLine(commandLine);
    statusParameters.SubstituteParametersInCommandLine(commandLine);

    inParameters.Execute(statusTextConsumer);
    system(commandLine.c_str());
    statusParameters.Execute(statusTextConsumer);
    outParameters.Execute(statusTextConsumer);
  }

protected:
  CommandLineOperation(
                       string command_line,
                       IDataProvider& data_provider,
                       IStatusTextConsumer& status_consumer
                      )
  : dataProvider(data_provider),
    statusTextConsumer(status_consumer),
    commandLine(command_line),
    inParameters("provide data"),
    statusParameters("consume status"),
    outParameters("consume data")
  {
  }
  void SetPossibleInParameters()
  {
    inParameters.Add(new InEnvParameter(dataProvider));
    inParameters.Add(new InBdyParameter(dataProvider));
    inParameters.Add(new InXmlBdyParameter(dataProvider));
    inParameters.Add(new InMsgParameter(dataProvider));
    inParameters.Add(new InAttachDirParameter(dataProvider));
  }
  void SetPossibleStatusParameters()
  {
    statusParameters.Add(new StatusParameter(statusTextConsumer));
  }
protected:
  IDataProvider& dataProvider;
  IStatusTextConsumer& statusTextConsumer;
  string commandLine;
  Parameters inParameters;
  Parameters statusParameters;
  Parameters outParameters;
};
// An Update operation done via a command line
class CommandLineUpdateOperation : public CommandLineOperation
{
public:
  CommandLineUpdateOperation(
                             string command_line,
                             IDataProvider& data_provider,
                             IStatusTextConsumer& status_consumer
                            )
  : CommandLineOperation(command_line, data_provider, status_consumer)
  {
    SetPossibleInParameters();
    SetPossibleStatusParameters();
  }
};
// A Generate operation done via a command line
class CommandLineGenerateOperation : public CommandLineOperation
{
public:
  CommandLineGenerateOperation(
                               string command_line,
                               IDataProvider& data_provider,
                               IDataConsumer& data_consumer,
                               IStatusTextConsumer& status_consumer
                              )
  : CommandLineOperation(command_line, data_provider, status_consumer),
    dataConsumer(data_consumer)
  {
    SetPossibleInParameters();
    SetPossibleOutParameters();
    SetPossibleStatusParameters();
  }
private:
  void SetPossibleOutParameters()
  {
    outParameters.Add(new OutEnvParameter(dataConsumer));
    outParameters.Add(new OutBdyParameter(dataConsumer));
    outParameters.Add(new OutXmlBdyParameter(dataConsumer));
    outParameters.Add(new OutMsgParameter(dataConsumer));
    outParameters.Add(new OutAttachDirParameter(dataConsumer));
  }
  private:
    IDataConsumer& dataConsumer;
  };
}