[Xotcl] 'assign' method of properties not called on object initialization
Gustaf Neumann
neumann at wu-wien.ac.at
Thu Jan 26 13:54:46 CET 2012
Dear Arthur,
this is a known problem area, already on our todo list.
What you are defining is an user-defined, slot-specific
parameter type.
In nx, object parameters are closer to the general parameter
handling (e.g. method parameters) than to accessors. The
parameters provide a rich set of configuration options
(value checkers, multiplicity, requiredness, ...). NX comes
with several built-in checkers/converters, which can be
extended with user-defined (scripted) checkers (see [1]).
For value checkers, a developer can decide, for which kind
of parameter a checker should be applicable. When a
value-checker is defined on the class nx::Slot, then this
checker can be used for method parameters in the same way as
for object parameters (see [2]).
[1]
http://next-scripting.org/docs/2.0b2/doc/nx/tutorial/index1#_value_constraints
[2]
http://next-scripting.org/docs/2.0b2/doc/nx/tutorial/index1#_slot_classes_and_slot_objects
Your example can be defined with a scripted checker as shown
below.
======================================================
nx::Class create Foo {
:property bar {
:type "bar"
:method type=bar {name value} {
puts stderr "assign called for $name $value"
}
}
}
set foo [Foo new]
$foo bar "test"
Foo new -bar "test"
======================================================
The checker is called here - as expected - twice.
In the more general case below, the converter is defined on
nx::Slot, therefore applicable for every parameter (e.g. for
property "bar" and for the method "abrakadabra").
======================================================
nx::Slot public method type=baz {name value} {
puts stderr "assign called for $name $value"
}
nx::Class create Baz {
:property bar:baz
:public method abrakadabra {x:int y:baz,1..n} { return $x-$y }
}
set baz [Baz new]
$baz bar "test"
$baz abrakadabra 1 {a b c}
Baz new -bar "test"
======================================================
Since y of abrakadabra has defined the multiplicity 1..n,
the checker is called for every single value (in the snipped
above 5 times).
The new parameters are more powerful and general than the
xotcl-style "assign" method; so i tend to believe the latter
is obsolete. Some cleanup is here still necessary.
-gustaf neumann
On 26.01.12 12:06, Arthur Schreiber wrote:
> Hi everyone,
>
> When assigning an object's property using object parameters, the assign
> method of that property does not get called. Is that a bug or intended
> behaviour?
>
> See the following code:
>
> package require nx
>
> nx::Class create Foo {
> :property bar {
> :public method assign { object property value } {
> puts "assign called for: $object $property $value"
> }
> }
> }
>
> set foo [Foo new]
> $foo bar "test"; # assign method of the bar property is called
>
> Foo new -bar "test"; # assign method of the bar property is _not_ called
>
> Kind regards,
> Arthur
> _______________________________________________
> Xotcl mailing list
> Xotcl at alice.wu-wien.ac.at
> http://alice.wu-wien.ac.at/mailman/listinfo/xotcl
More information about the Xotcl
mailing list