whole_func_string: function define (protocolName) {
    return function (services, ...callbacks) {
      let builder
      const protocolClass = class extends FogletProtocol {
        constructor (foglet, ...args) {
          super(protocolName, foglet, ...args)
        }
      }
      // clean services names before building
      services.map(str => str.trim())
        .filter(str => str.length > 0)
        .forEach((name, index) => {
          if (name === 'init' || name === 'constructor') {
            builder = new InitBuilder(callbacks[index])
          } else {
            builder = new ServiceBuilder(name)
            callbacks[index](builder)
          }
          builder.apply(protocolClass)
        })
      return protocolClass
    }
  }
func_code_string: function define (protocolName) {
    return function (services, ...callbacks) {
      let builder
      const protocolClass = class extends FogletProtocol {
        constructor (foglet, ...args) {
          super(protocolName, foglet, ...args)
        }
      }
      // clean services names before building
      services.map(str => str.trim())
        .filter(str => str.length > 0)
        .forEach((name, index) => {
          if (name === 'init' || name === 'constructor') {
            builder = new InitBuilder(callbacks[index])
          } else {
            builder = new ServiceBuilder(name)
            callbacks[index](builder)
          }
          builder.apply(protocolClass)
        })
      return protocolClass
    }
  }
func_documentation_string: Create a function that evaluates a tagged template to create a new subclass of {@link FogletProtocol}
  that implements the protocol described in the template.
  @param  {string} protocolName - The name of the protocol
  @return {function} A function that evaluates a tagged template to create a new subclass of {@link FogletProtocol}
  @example
  const ExampleUnicastProtocol = defineProtocol('example-unicast-protocol')`
  init
  ${function (base) {
  this._base = base;
  }}
  get
  ${function(service) {
  service.is.unicast();
  service.on.receive(function (id, msg, reply, reject) {
  if (msg.number % this._base === 0)
  reply(`${msg.number} is a multiple of ${this._base}`);
  else
  reject(`${msg.number} is not a multiple of ${this._base}`);
  });
  }}
  `;
  
  module.exports = ExampleUnicastProtocol;