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