Module: @QName: Util:ManakaiNode @FullName: @@lang: en @@@: Manakai Generic Node Implementation @Namespace: http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/ManakaiNode# @Description: @@lang:en @@@: The module provides a basic implementation for glaph (perhaps tree) structures. @DISCore:author: DISCore|Wakaba @License: license:Perl+MPL @Date: $Date: 2005/10/12 14:46:06 $ @Require: @@Module: @@@QName: DISlib|DISPerl @@@WithFor: ManakaiDOM|all @DefaultFor: ManakaiDOM:Perl Namespace: @dis: http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#dis-- @DISlib: http://suika.fam.cx/~wakaba/archive/2004/dis/ @kwd: http://suika.fam.cx/~wakaba/archive/2005/rfc2119/ @lang: http://suika.fam.cx/~wakaba/archive/2004/8/18/lang# @license: http://suika.fam.cx/~wakaba/archive/2004/8/18/license# @ManakaiDOM: http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom# @mn: http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/ManakaiNode# @rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns# @rdfs: http://www.w3.org/2000/01/rdf-schema# @Util: http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/ ResourceDef: @QName: Util: @rdf:type: dis:ModuleGroup @FullName: @@lang:en @@@: The manakai support modules @DISPerl:packageName: Message::Util:: @DISPerl:interfacePackageName: Message::Util::IF:: @ImplNote: @@lang:en @@@: This resource is also defined in and modules. ## -- Internal node object ClassDef: @resourceFor: ManakaiDOM|ForIF @resourceFor: ManakaiDOM|ForClass @QName: @@@: NodeStem @@ForCheck: ManakaiDOM|ForIF @QName: @@@: ManakaiNodeStem @@ForCheck: ManakaiDOM|ForClass @Implement: @@@: NodeStem @@ForCheck: ManakaiDOM|ForClass @Implement: @@@: NodeStem @@ForCheck: ManakaiDOM|ForClass @Description: @@lang:en @@@: Internal (actual) node objects that is accessed via objects referring it. @ImplNote: @@lang:en @@@: No public interface should be defined for any class inheriting this class - applications should access to nodes only via objects. @ImplNote: @@ForCheck: ManakaiDOM|ForClass @@lang:en @@@: A object is a blessed hash reference. Each hash key and value pair is called as a . Currently, several core properties are defined. Applications of this class define additional properties for their own purpose and scope. @IntMethod: @@Name: new @@Description: @@@lang:en @@@@: Constructs a new instance of and returns it. @@Param: @@@Name: className @@@Type: DISLang|String||ManakaiDOM|all @@@enDesc: The name of a class which is typically used as reference to the node. The class implement the interface. The definition for the class play the role of . @@Return: @@@Type: NodeStem @@@Description: @@@@lang:en @@@@@: The newly created instance. @@@PerlDef: my $grc = 0; $r = bless { => $className, => \$grc, => 0, => \ (), => , }, ref $self || $self; @IntMethod: @@Name: newNode @@enDesc: Returns a new node that belongs to the same grove with the node. @@Param: @@@Name: className @@@Type: DISLang|String||ManakaiDOM|all @@@enDesc: The name of a class which is typically used as reference to the node. The class implement the interface. The definition for the class play the role of . @@Return: @@@Type: NodeStem @@@enDesc: The newly created node. @@@PerlDef: $r = bless { => $className, => $self->{}, => 0, => $self->{}, => , }, ref $self; @ResourceDef: @@QName: getNewReference @@rdf:type: DISPerl|BlockCode @@ForCheck: ManakaiDOM|ForClass @@Description: @@@lang:en @@@@: Creates a new node reference object. @@ResourceDef: @@@rdf:type: DISPerl:CodeParameter @@@Name: $object @@@Type: NodeStem @@@In:1 @@@enDesc: A node object for which a reference is created. @@@DISPerl:paramStyle: var @@ResourceDef: @@@rdf:type: DISPerl:CodeParameter @@@Name: $ref @@@Type: NodeRef @@@Out:1 @@@enDesc: A node reference for . It may or may not be same as . @@@DISPerl:paramStyle: var @@ResourceDef: @@@rdf:type: DISPerl:CodeParameter @@@Name: $class @@@Type: DISLang|String||ManakaiDOM|all @@@enDesc: A package name with which is blessed. @@@In:1 @@@DISPerl:paramStyle: any @@PerlDef: $object->{}++; ${$object->{}}++; $ref = bless { => $object, }, $class; @ResourceDef: @@QName: getWeakReference @@rdf:type: DISPerl|BlockCode @@ForCheck: ManakaiDOM|ForClass @@Description: @@@lang:en @@@@: Creates a new weak node reference object. \ The weak node reference is actually a node reference except that this code fragment does not increment the reference count of the object. When all non-weak references to the object are destructed, then the object is destructed and any operation via weak references will lead unexpected result. \ {NOTE:: It is intended that internal code creates a weak reference so that it gets access to public interface. \ } @@ResourceDef: @@@rdf:type: DISPerl:CodeParameter @@@Name: $object @@@Type: NodeStem @@@In:1 @@@enDesc: A node object for which a reference is created. @@@DISPerl:paramStyle: var @@ResourceDef: @@@rdf:type: DISPerl:CodeParameter @@@Name: $ref @@@Type: NodeRef @@@Out:1 @@@enDesc: A node reference for . It may or may not be same as . @@@DISPerl:paramStyle: var @@ResourceDef: @@@rdf:type: DISPerl:CodeParameter @@@Name: $class @@@Type: DISLang|String||ManakaiDOM|all @@@enDesc: A package name with which is blessed. @@@In:1 @@@DISPerl:paramStyle: any @@PerlDef: $ref = bless { => $object, => true, }, $class; @ResourceDef: @@QName: getWeakRef @@rdf:type: DISPerl|InlineCode @@ForCheck: ManakaiDOM|ForClass @@Description: @@@lang:en @@@@: Creates a new weak node reference object. \ The weak node reference is actually a node reference except that this code fragment does not increment the reference count of the object. When all non-weak references to the object are destructed, then the object is destructed and any operation via weak references will lead unexpected result. \ {NOTE:: It is intended that internal code creates a weak reference so that it gets access to public interface. \ } @@ResourceDef: @@@rdf:type: DISPerl:CodeParameter @@@Name: $object @@@Type: NodeStem @@@In:1 @@@enDesc: A node object for which a reference is created. @@@DISPerl:paramStyle: var @@ResourceDef: @@@rdf:type: DISPerl:CodeParameter @@@Name: $class @@@Type: DISLang|String||ManakaiDOM|all @@@enDesc: A package name with which is blessed. @@@In:1 @@@DISPerl:paramStyle: any @@PerlDef: (bless { => $object, => true, }, $class) @IntMethod: @@Name: isExternallyReferred @@Description: @@@lang:en @@@@: Checks whether the tree containing this node has been referred from the outside of the tree or not. @@Return: @@@Type: DISPerl:Boolean::ManakaiDOM:all @@@InCase: @@@@Value: @@@@@@:1 @@@@@ContentType: DISCore|Boolean @@@@Description: @@@@@lang:en @@@@@@: There is one or more nodes in the tree that has been referred via objects. @@@InCase: @@@@Value: @@@@@@:0 @@@@@ContentType: DISCore|Boolean @@@@Description: @@@@@lang:en @@@@@@: No external reference found. @@@PerlDef: if ($self->{}) { $r = true; } else { my @node = ($self); my %checked; NODES: while (@node) { my $node = shift @node; next NODES unless ref $node; if ($node->{}) { $r = true; last NODES; } elsif ($checked{$node->{}}) { next NODES; } my @n; my $nt = $Message::Util::ManakaiNode::ManakaiNodeRef::Prop{ $node->{} }; for my $p (@{$nt->{}}) { if (ref $node->{$p} eq 'ARRAY') { push @n, @{$node->{$p}}; } elsif (ref $node->{$p} eq 'HASH') { push @n, values %{$node->{$p}}; } } for my $p (@n, map {$node->{$_}} @{$nt->{}}) { if (ref $p eq 'ARRAY') { push @node, @$p; } elsif (ref $p eq 'HASH') { push @node, values %$p; } } for my $p (@{$nt->{}}) { unshift @node, $node->{$p} if $node->{$p}; ## NOTE: Puts the top of the list, ## since upper-level nodes are expected to be referred ## more than lower-levels. } for my $p (@{$nt->{}}) { push @node, $node->{$p} if $node->{$p}; } $checked{$node->{}} = true; } } @ResourceDef: @@QName: mn|isGroveReferenced @@rdf:type: DISPerl|InlineCode @@ForCheck: ManakaiDOM|ForClass @@PerlDef: (${$node->{}} > 0) @IntMethod: @@Name: destroy @@Description: @@@lang:en @@@@: Destructs the tree containing this node. @@Return: @@@PerlDef: my @node = ($self); my $tid = $self->{}; my %xrnode; NODES: while (@node) { my $node = shift @node; next NODES unless ref $node and defined $node->{}; my @n; my $nt = $Message::Util::ManakaiNode::ManakaiNodeRef::Prop{ $node->{} }; for my $p (@{$nt->{}||[]}) { my $ref = ref $node->{$p}; if ($ref eq 'HASH') { push @n, values %{$node->{$p}}; } elsif ($ref eq 'ARRAY') { push @n, @{$node->{$p}}; } } for my $p (@n, map {$node->{$_}} @{$nt->{}||[]}) { my $ref = ref $p; if ($ref eq 'ARRAY') { push @node, @$p; } elsif ($ref eq 'HASH') { push @node, values %$p; } } for my $p (@{$nt->{}||[]}, \ @{$nt->{}||[]}) { push @node, $node->{$p}; } for my $p (@{$nt->{}||[]}) { if (defined $node->{$p} and ${$node->{$p}->{}||$tid} ne $$tid) { $node->{$p}->{}--; ${$node->{$p}->{}}--; $xrnode{${$node->{$p}->{}}} = $node->{$p}; } } %$node = (); } # @node CORE::delete $xrnode{$$tid}; for my $node (values %xrnode) { unless () { $node->; } } @@ImplNote: @@@lang:en @@@@: This method is different from Perl special purpose method. \ An warning in this method might mean some method puts an into a list of nodes. @IntMethod: @@Name: importTree @@Description: @@@lang:en @@@@: Changes the tree identifier of the nodes belong to another tree to be same as this node's tree identifier. @@Param: @@@Name: node @@@Type: NodeStem @@@Description: @@@@lang:en @@@@@: Any node from the tree to change its identifier. @@Return: @@@PerlDef: my @node = ($node); my $newgrc = $self->{}; my $newtid = $self->{}; my $oldtid = $node->{}; my @xrnode; NODES: while (@node) { my $node = shift @node; next NODES unless ref $node; next NODES if ${$node->{}} eq $$newtid; my @n; my $nt = $Message::Util::ManakaiNode::ManakaiNodeRef::Prop{ $node->{} }; for my $p (@{$nt->{}||[]}) { my $ref = ref $node->{$p}; if ($ref eq 'HASH') { push @n, values %{$node->{$p}}; } elsif ($ref eq 'ARRAY') { push @n, @{$node->{$p}}; } } for my $p (@n, map {$node->{$_}} @{$nt->{}||[]}) { my $ref = ref $p; if ($ref eq 'ARRAY') { push @node, @$p; } elsif ($ref eq 'HASH') { push @node, values %$p; } } for my $p (@{$nt->{}||[]}, \ @{$nt->{}||[]}) { push @node, $node->{$p} if defined $node->{$p}; } for (@{$nt->{}||[]}) { push @xrnode, $node->{$_} if defined $node->{$_}; } ${$node->{}} -= $node->{}; $node->{} = $newtid; $node->{} = $newgrc; $$newgrc += $node->{}; } for my $n (@xrnode) { if (${$n->{}} eq $$oldtid) { $n->{}++; ${$n->{}}++; } elsif (${$n->{}} eq $$newtid) { $n->{}--; ${$n->{}}--; ## Is it necessary to test whether rc is 0 or not ## and if so call "destroy" method? Maybe it need not ## (or should not, rather). } } @IntMethod: @@Name: changeTreeID @@Description: @@@lang:en @@@@: Changes tree identifier of all nodes traversable from this node. If a node has property value and it is a node in the tree to which the node formally belongs, then reference counters are updated to new status. @@Param: @@@Name: treeID @@@Type: DISPerl:String::ManakaiDOM:all @@@Description: @@@@lang:en @@@@@: The new tree identifier. @@@InCase: @@@@Type: DISPerl|SCALAR||ManakaiDOM|all @@@@enDesc: A reference to the new tree identifier. The tree will reference the identifier as it. @@Param: @@@Name: groveRC @@@Type: DISPerl|SCALAR||ManakaiDOM|all @@@enDesc: The new reference counter. @@Return: @@@PerlDef: my $tid = ref $treeID ? $treeID : \$treeID; my $oldtid = $self->{}; my @xrnode; my @node = ($self); NODES: while (@node) { my $node = shift @node; next NODES unless ref $node; next NODES if ${$node->{}} eq $$tid; my @n; my $nt = $Message::Util::ManakaiNode::ManakaiNodeRef::Prop{ $node->{} }; for my $p (@{$nt->{}||[]}) { if (ref $node->{$p} eq 'ARRAY') { push @n, @{$node->{$p}}; } elsif (ref $node->{$p} eq 'HASH') { push @n, values %{$node->{$p}}; } } for my $p (@n, map {$node->{$_}} @{$nt->{}||[]}) { if (ref $p eq 'ARRAY') { push @node, @$p; } elsif (ref $p eq 'HASH') { push @node, values %$p; } } for my $p (@{$nt->{}||[]}, \ @{$nt->{}||[]}) { push @node, $node->{$p}; } for (@{$nt->{}||[]}) { push @xrnode, $node->{$_} if defined $node->{$_}; } ${$node->{}} -= $node->{}; $node->{} = $tid; $node->{} = $groveRC; ${$node->{}} += $node->{}; } for my $n (@xrnode) { if (${$n->{}} eq $$oldtid) { $n->{}++; ${$n->{}}++; } elsif (${$n->{}} eq $$tid) { $n->{}--; ${$n->{}}--; ## Is it necessary to test whether rc is 0 or not ## and if so call "destroy" method? Maybe it need not ## (or should not, rather). } } @IntMethod: @@Name: isSameNode @@Description: @@@lang:en @@@@: Returns whether a node is the same as this node or not. \ {NOTE:: The sameness is different from the equality; two nodes are same iff they are same hash reference. \ } @@Operator: @@@ContentType: lang:Perl @@@@: eq @@Param: @@@Name: node @@@Type: NodeStem @@@Description: @@@@lang:en @@@@@: A node to compare with. @@Return: @@@Type: DISPerl:Boolean::ManakaiDOM:all @@@Description: @@@@lang:en @@@@@: Whether the two nodes are same or not. @@@PerlDef: if (ref $node and UNIVERSAL::isa ($node, ) and $node->{} eq $self->{}) { $r = true; } @IntMethod: @@Name: orphanate @@Description: @@@lang:en @@@@: Notifies that this node (and its neibors if any) is no longer part of the main tree. If the new tree containing this node has been referred yet, then the tree is preserved except its tree identifier has changed. Otherwise, i.e. the tree is useless any more, then it is destructed. \ {NOTE:: Interaction on deleting a relationship from multiply organized (such as DOM tree and styled displaying tree) is less studied. This method might be modified or addition of another method(s) might be required when style sheet, XBL, or other technologies has been implemented. \ } @@Return: @@@PerlDef: if ($self->) { my $grc = 0; $self-> (\(), \$grc); } else { $self->; } @ResourceDef: @@ForCheck: ManakaiDOM|ForClass @@QName: mn|setXRefNode @@enDesc: Sets a property. @@rdf:type: DISPerl|BlockCode @@PerlDef: $referrer->{$propName} = $referent; if (${$referrer->{}} ne ${$referent->{}}) { $referent->{}++; ${$referent->{}}++; } @ResourceDef: @@ForCheck: ManakaiDOM|ForClass @@QName: mn|unsetXRefNode @@enDesc: Unsets a property. @@rdf:type: DISPerl|BlockCode @@PerlDef: if (defined $referrer->{$propName}) { my $__referent = $referrer->{$propName}; if (${$referrer->{}} ne ${$__referent->{}}) { $__referent->{}--; ${$__referent->{}}--; unless () { $__referent->; } } CORE::delete $referrer->{$propName}; } ##NodeStem ## -- Public node object ClassDef: @resourceFor: ManakaiDOM|ForClass @resourceFor: ManakaiDOM|ForIF @QName: @@@: NodeRef @@ForCheck: ManakaiDOM|ForIF @QName: @@@: ManakaiNodeRef @@ForCheck: ManakaiDOM|ForClass @Implement: @@@: NodeRef @@ForCheck: ManakaiDOM|ForClass @DISLang:role: @@@: mn|NodeRefRole @@ForCheck: ManakaiDOM|ForClass @Description: @@lang:en @@@: References to the node object corresponding to it. From applications' view, any node object is hidden and seems as if the node itself. @ImplNote: @@lang:en @@@: {P:: A is a blessed hash reference; currently there is a hash key defined: \ - ::: A node object () to which this is referring. - ::: Whether the reference is or not. } @ResourceDef: @@Name: free @@rdf:type: DISLang|Method @@enDesc: Frees the grove referenced by this object. Once this operation is done, results of operations to objects belonging to the grove are unknown. @@Return: @@@PerlDef: $self->{}->; @IntMethod: @@Name: destroy @@Description: @@@lang:en @@@@: Destroy this reference object. @@Operator: @@@ContentType: lang:Perl @@@@: DESTROY @@Return: @@@PerlDef: @@@@@: if (my $node = $self->{}) { CORE::delete $self->{}; unless ($self->{}) { $node->{}--; ${$node->{}}--; unless () { $node->; } } } else { warn ref ($self) . q{->DESTROY: there is no associated }. q{node object - you have a global variable or }. qq{potential memory-leak detected\n}; } @@@@ImplNote: @@@@@lang:en @@@@@@: {P::Warning during the global destruction might mean: \ - there be a loop in the manakai internal implementation - it should be a bug. \ - there be a loop created by application, e.g. event handler containing a reference to any node belonging to the same tree. \ - there be a global variable that contains a node reference and it is not altered or ed until the global destruction. \ - or other unknown bad situation. \ } @@ImplNote: @@@lang:en @@@@: Don't override this method unintentionally - for example, inheritting would hide this method from that class, since that module defines its own destructor. ##NodeRef ResourceDef: @QName: mn|NodeRefRole @rdf:type: DISLang|Role @For: =ManakaiDOM|all @enDesc: The definition for a class which plays the role of provides a set of properties such as which identify the set of object internal property names (or hash key names) used to construct groves. PropDef: @QName: mn|type @mn:stemName: t PropDef: @QName: mn|noderef @dataType: DISCore|QName @multipleProperties: DISCore|UnorderedList PropDef: @QName: mn|subnode0 @enDesc: A property of type takes a value of reference to another node () in the same grove. The referenced node is considered to make a part of the node and just one property of the referenced node have a reference to the node. That is, these properties shows a origin-subnode-relationship. @dataType: DISCore|QName @multipleProperties: DISCore|UnorderedList @mn:stemName: s0 PropDef: @QName: mn|subnode1 @enDesc: A property of type is similar to properties, but its value is an array or hash reference whose values are references to subnodes. @rdfs:subPropertyOf: mn|noderef @dataType: DISCore|QName @multipleProperties: DISCore|UnorderedList @mn:stemName: s PropDef: @QName: mn|subnode2 @enDesc: A property of type is similar to properties, but its value is an array or hash reference whose values are array or hash references whose values are references to subnodes. @rdfs:subPropertyOf: mn|noderef @dataType: DISCore|QName @multipleProperties: DISCore|UnorderedList @mn:stemName: s2 PropDef: @QName: mn|origin0 @rdfs:subPropertyOf: mn|noderef @dataType: DISCore|QName @multipleProperties: DISCore|UnorderedList @mn:stemName: o PropDef: @QName: mn|xrefnode0 @rdfs:subPropertyOf: mn|noderef @dataType: DISCore|QName @multipleProperties: DISCore|UnorderedList @mn:stemName: x @rdf:type: DISSource|ResourceProperty @enDesc: An property references a node in the tree that might be different from the tree to which the subject node of the property belongs. When the property value is set and is different from , then reference counters for and are increased, so that the tree would not be deleted while this link has been maintained. When the property value is unset or an operation makes two trees to one, then two reference counters are decreased. PropDef: @QName: mn|irefnode0 @rdfs:subPropertyOf: mn|noderef @dataType: DISCore|QName @multipleProperties: DISCore|UnorderedList @mn:stemName: i PropDef: @QName: mn|anydata1 @rdfs:subPropertyOf: mn|noderef @dataType: DISCore|QName @multipleProperties: DISCore|UnorderedList @mn:stemName: a1 PropDef: @QName: mn|anydata2 @rdfs:subPropertyOf: mn|noderef @dataType: DISCore|QName @multipleProperties: DISCore|UnorderedList @mn:stemName: a2 PropDef: @QName: mn|nodeID @enDesc: The globally unique identifier of the node. @mn:stemName: nid PropDef: @QName: mn|treeID @enDesc: The globally unique identifier of the grove to which the node belongs. @mn:stemName: tid PropDef: @QName: mn|rc @enDesc: The number of the reference that points the node. @mn:stemName: rc PropDef: @QName: mn|groveReferenceCounter @enDesc: A reference to the number of references that reference a node in the grove. @mn:stemName: grc PropDef: @QName: mn|node @mn:refName: node @rdfs:domain: mn|NodeRef||ManakaiDOM|Perl @rdfs:range: mn|NodeStem||ManakaiDOM|Perl PropDef: @QName: mn|isWeak @enDesc: Whether a reference is weak or not. @rdfs:domain: mn|NodeRef||ManakaiDOM|Perl @Type: DISPerl|Boolean @mn:refName: w PropDef: @QName: mn|stemName @enDesc: The key name of the property when it is used in . @dataType: DISCore|String @multipleProperties: DISCore|Single @rdfs:domain: rdfs|Property @rdfs:subPropertyOf: DISPerl|propHashKey PropDef: @QName: mn|refName @enDesc: The key name of the property when it is used in . @dataType: DISCore|String @multipleProperties: DISCore|Single @rdfs:domain: rdfs|Property @rdfs:subPropertyOf: DISPerl|propHashKey ElementTypeBinding: @Name:PropDef @ElementType: dis:ResourceDef @ShadowContent: @@rdf:type: rdf:Property @@For: =ManakaiDOM|all ElementTypeBinding: @Name:enDesc @ElementType: dis:Description @ShadowContent: @@lang:en ## -- Frequently used code fragments ResourceDef: @QName: ManakaiDOM:generateUniqueID @rdf:type: DISPerl|InlineCode @Description: @@lang:en @@@: Generates a global-unique opaque string. \ {NOTE:: A URI reference is generated by this code. \ } @For: =ManakaiDOM|Perl @PerlDef: ( 'tag:suika.fam.cx,2005-09:' . time . ':' . $$ . ':' . ($Message::Util::ManakaiNode::UniqueIDR ||= [qw/A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9/]->[rand 62] . [qw/A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9/]->[rand 62] . [qw/A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9/]->[rand 62] . [qw/A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9/]->[rand 62] . [qw/A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9/]->[rand 62]) . (++$Message::Util::ManakaiNode::UniqueIDN) ) ##ManakaiDOM:generateUniqueID ## -- lang:dis vocabulary TreeElementType: @QName: dis:GetProp @dataType: dis:TypeQName @rdfs:range: rdf:Property @Description: @@lang:en @@@: Gets the non-nodal value of a property (actualy property). TreeElementType: @QName: dis:SetProp @dataType: DISCore|QName @rdfs:range: rdf:Property @Description: @@lang:en @@@: Sets the non-nodal value of a property (actualy property). ## -- Syntax sugar ElementTypeBinding: @Name: TreeElementType @ElementType: dis:ResourceDef @ShadowContent: @@rdf:type: DISLang:TreeElementType @@For: =ManakaiDOM|all ElementTypeBinding: @Name: ClassDef @ElementType: dis:ResourceDef @ShadowContent: @@rdf:type: @@@@: dis:MultipleResource @@@ForCheck: !ManakaiDOM|ForClass !ManakaiDOM|ForIF @@rdf:type: @@@@: DISLang|Interface @@@ForCheck: ManakaiDOM|ForIF @@rdf:type: @@@@: DISLang|Class @@@ForCheck: ManakaiDOM|ForClass @@ForCheck: ManakaiDOM|Perl ElementTypeBinding: @Name: IntMethod @ElementType: dis:ResourceDef @ShadowContent: @@rdf:type: DISLang:Method @@ManakaiDOM:isForInternal:1 ElementTypeBinding: @Name: Return @ElementType: dis:ResourceDef @ShadowContent: @@rdf:type: DISLang:MethodReturn ElementTypeBinding: @Name: Param @ElementType: dis:ResourceDef @ShadowContent: @@rdf:type: DISLang:MethodParameter ElementTypeBinding: @Name: PerlDef @ElementType: dis:Def @ShadowContent: @@ContentType: lang:Perl ElementTypeBinding: @Name: InCase @ElementType: dis:ResourceDef @ShadowContent: @@rdf:type: ManakaiDOM:InCase