NAME

       configbody  -  change the "config" code for a public vari­
       able


SYNOPSIS

       configbody className::varName body
_________________________________________________________________


DESCRIPTION

       The configbody command is used outside  of  an  [incr Tcl]
       class  definition  to define or redefine the configuration
       code associated with a public variable.  Public  variables
       act like configuration options for an object.  They can be
       modified outside the class scope using the  built-in  con­
       figure  method.   Each variable can have a bit of "config"
       code associate with it that is automatically executed when
       the variable is configured.  The configbody command can be
       used to define or redefine this body of code.

       Like the body command, this facility allows a class  defi­
       nition  to  have separate "interface" and "implementation"
       parts.  The "interface" part is a class command with  dec­
       larations  for methods, procs, instance variables and com­
       mon variables.  The "implementation" part is a  series  of
       body  and  configbody  commands.   If the "implementation"
       part is kept in a separate file, it can be  sourced  again
       and again as bugs are fixed, to support interactive devel­
       opment.  When using the "tcl" mode in  the  emacs  editor,
       the  "interface" and "implementation" parts can be kept in
       the same file; as bugs are fixed, individual bodies can be
       highlighted and sent to the test application.

       The  name "className::varName" identifies the public vari­
       able being updated.  If the body string starts  with  "@",
       it  is  treated  as  the  symbolic name for a C procedure.
       Otherwise, it is treated as a Tcl command script.

       Symbolic names for C procedures are established by  regis­
       tering  procedures  via Itcl_RegisterC().  This is usually
       done in the Tcl_AppInit() procedure,  which  is  automati­
       cally  called when the interpreter starts up.  In the fol­
       lowing example, the procedure  My_FooCmd()  is  registered
       with  the symbolic name "foo".  This procedure can be ref­
       erenced in the configbody command as "@foo".
              int
              Tcl_AppInit(interp)
                  Tcl_Interp *interp;     /* Interpreter for application. */
              {
                  if (Itcl_Init(interp) == TCL_ERROR) {
                      return TCL_ERROR;
                  }

                      return TCL_ERROR;
                  }
              }


EXAMPLE

       In the following example, a "File"  class  is  defined  to
       represent open files.  Whenever the "-name" option is con­
       figured, the existing file is closed, and a  new  file  is
       opened.  Note that the "config" code for a public variable
       is optional.  The "-access" option, for example, does  not
       have it.
              class File {
                  private variable fid ""

                  public variable name ""
                  public variable access "r"

                  constructor {args} {
                      eval configure $args
                  }
                  destructor {
                      if {$fid != ""} {
                          close $fid
                      }
                  }

                  method get {}
                  method put {line}
                  method eof {}
              }

              body File::get {} {
                  return [gets $fid]
              }
              body File::put {line} {
                  puts $fid $line
              }
              body File::eof {} {
                  return [::eof $fid]
              }

              configbody File::name {
                  if {$fid != ""} {
                      close $fid
                  }
                  set fid [open $name $access]
              }

              #
              # See the File class in action:
              #
              File x

              while {![x eof]} {
                  puts "=> [x get]"
              }
              delete object x


KEYWORDS

       class, object, variable, configure


Man(1) output converted with man2html