[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