OOSupport
- simplify object-oriented programming in [incr Tcl]
package require Itcl
package require OOSupport
itcl::class Item {
common attributes {
{string name "" rw}
{bool active false rw}
{number value 0.0 rw}
{[::Item] subitems {} rw}
}
constructor {} {
OOSupport::init_attributes
}
OOSupport::bless_attributes -json_support
}
set sub_item1 [Item #auto]
$sub_item1 set_name "sub item1"
$sub_item1 set_active true
$sub_item1 set_value 23.7
set sub_item2 [Item #auto]
$sub_item2 set_name "sub item2"
$sub_item2 set_active true
$sub_item2 set_value 14.8
set main_item [Item #auto]
$main_item set_name "main item"
$main_item set_value 1
$main_item set_subitems [list [namespace which $sub_item1] \
[namespace which $sub_item2]]
# save main item as JSON
set json_dump [$main_item to_json]
# initialize different item from JSON
set new_item [Item #auto]
$new_item from_json $json_dump
puts [$new_item to_json]
This module provides convenience functions that allow you to define attributes on your Itcl classes and automatically generate getters, setters and support for serialization to JSON.
When defining a new type, you can declare its accessible properties in a class
variable called attributes
:
itcl::class Type {
common attributes {
{type name default access}
...
}
...
The type specifier should be one of bool, number, string or a class
name that is recognized by itcl::is class
. Additionally you can declare arrays
of either type by putting the type specifier in square brackets. It is not
possible to keep mixed-type arrays.
The type specifier is evaluated during serialization to or de-serialization from JSON. Since Tcl doesn't have explicit types, it would otherwise not be possible to map to and from JSON without loss of information.
After having declared the common attributes
, you have to bring them to life,
by calling OOSupport::init_attributes
in the constructor:
...
constructor {} {
OOSupport::init_attributes
}
...
This way, when an object is instantiated, member variables will be created
automatically according to the attributes declaration. For an attribute name
the corresponding member variable will be _name
. The member variable will be
initiated to the default value supplied in the attribute declaration.
Last but not least, you can bless your attributes with accessor functions according to the access specification, which can be one of
The getters or setters are created by calling OOSupport::bless_attributes
in the body of your class definition. If read support is enabled for an
attribute name, the attribute value can be retrieved by calling a method
name
. If write support is enabled on the attribute, then the attribute
can be set via a method set_name
.
If you pass the additional parameter -json_support
to bless_attributes
,
your objects will also have methods to_json
and from_json
which can be
used to serialize the object state to JSON or restore an object from its
JSON representation.
OOSupport::init_attributes
In a constructor, bring to life member variables according to the `common attributes` declaration and initialize them with specified default values.
OOSupport::bless_attributes
?-opts?In the body of a class definition, auto-generate getter and setter methods for members according to the *access* specification of each attribute.
If the `-json_support` parameter is supplied, then objects will be blessed with additional methods `to_json` and `from_json` that allow serializing an object to and restoring it from JSON.
If `-skip_undefined` is specified, then empty strings and variables of other types that are initialized to `null` will not be included in JSON output.
If `-collapse_underscore` is given, then attributes of the form `attr_name` will be dumped and read in camel-case as `attrName` instead.
itcl
(3itcl), json
(3tcl)