code: function () {
              /*  determine parameters  */
              var params = $cs.params("register", arguments, {
                  name:      { pos: 0,     req: true  },
                  ctx:       {             def: this  },
                  func:      { pos: 1,     req: true  },
                  args:      { pos: "...", def: []    },
                  spool:     {             def: null  },
                  capturing: {             def: false },
                  spreading: {             def: false },
                  bubbling:  {             def: true  }
              });
  
              /*  create command object to wrap service  */
              var cmd = $cs.command({
                  ctx:   params.ctx,
                  func:  params.func,
                  args:  params.args,
                  wrap:  true
              });
  
              /*  publish changes to command's callable status  */
              cmd.command.listen({
                  name: "attribute:set:enabled",
                  args: [ this, params.name ],
                  func: function (comp, name, value_new, value_old) {
                      comp.publish({
                          name:      "ComponentJS:service:" + name + ":callable",
                          args:      [ value_new, value_old ],
                          capturing: false,
                          spreading: false,
                          bubbling:  false,
                          async:     true,
                          noresult:  true
                      });
                  }
              });
  
              /*  subscribe to service event  */
              var id = this.subscribe({
                  name:      "ComponentJS:service:" + params.name,
                  ctx:       params.ctx,
                  func:      cmd,
                  noevent:   true,
                  capturing: params.capturing,
                  spreading: params.spreading,
                  bubbling:  params.bubbling,
                  exclusive: true
              });
  
              /*  optionally spool reverse operation  */
              if (params.spool !== null) {
                  var info = _cs.spool_spec_parse(this, params.spool);
                  info.comp.spool(info.name, this, "unregister", id);
              }
  
              return id;
          }
docs: /*  register a service