/[suikacvs]/messaging/manakai/lib/Message/Util/ManakaiNode.dis
Suika

Contents of /messaging/manakai/lib/Message/Util/ManakaiNode.dis

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.9 - (hide annotations) (download)
Sun May 8 14:18:02 2005 UTC (20 years, 2 months ago) by wakaba
Branch: MAIN
Changes since 1.8: +15 -15 lines
Element-type specialized class implemented; interface association bug fixed

1 wakaba 1.1 Module:
2     @QName:
3     Util:ManakaiNode
4     @FullName:
5     @@lang: en
6     @@@:
7     Manakai Generic Node Implementation
8     @Namespace:
9     http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/ManakaiNode#
10    
11     @Description:
12     @@lang:en
13     @@@:
14     The <Module::Util:ManakaiNode> module provides a basic
15     implementation for glaph (perhaps tree) structures.
16    
17     @Author:
18     @@FullName: Wakaba
19     @@Mail: w@suika.fam.cx
20     @License:
21     license:Perl+MPL
22     @Date:
23     @@@:
24 wakaba 1.9 $Date: 2005/05/07 13:56:36 $
25 wakaba 1.1 @@ContentType:
26     dis:Date.RCS
27    
28     @Require:
29     @@Module:
30     @@@Name: DISPerl
31 wakaba 1.4 @@@QName:
32     DISlib:DISPerl
33 wakaba 1.1 @@@WithFor:
34     ManakaiDOM:all
35 wakaba 1.2 @@Module:
36     @@@Name: ManakaiNode
37     @@@WithFor:
38     ManakaiDOM:Perl
39    
40     @DefaultFor:
41     ManakaiDOM:Perl
42 wakaba 1.1
43     Namespace:
44     @dis:
45     http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#dis--
46     @dis2pm:
47     http://suika.fam.cx/~wakaba/archive/2004/11/8/dis2pm#
48 wakaba 1.4 @DISlib:
49     http://suika.fam.cx/~wakaba/archive/2004/dis/
50 wakaba 1.1 @lang:
51     http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#
52     @license:
53     http://suika.fam.cx/~wakaba/archive/2004/8/18/license#
54     @ManakaiDOM:
55     http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom#
56     @owl:
57     http://www.w3.org/2002/07/owl#
58     @Perl:
59     http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#Perl--
60     @rdf:
61     http://www.w3.org/1999/02/22-rdf-syntax-ns#
62     @rdfs:
63     http://www.w3.org/2000/01/rdf-schema#
64     @TreeCore:\
65     @Util:
66     http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/
67    
68     ResourceDef:
69     @QName:
70     Util:
71     @rdf:type:
72     dis:ModuleGroup
73     @FullName:
74     @@lang:en
75     @@@:
76     The manakai support modules
77     @AppName:
78     Message::Util::
79    
80     ## -- Internal node object
81    
82     ClassDef:
83     @QName:
84     ManakaiDOM:ManakaiDOMNodeObject
85     @Description:
86     @@lang:en
87     @@@:
88     Internal (actual) node objects that is accessed via
89     <Class::ManakaiDOM:ManakaiDOMNodeReference> objects referring it.
90     @ImplNote:
91     @@lang:en
92     @@@:
93     No public interface should be defined for any class inheriting
94     this class - applications should access to nodes only via
95     <Class::ManakaiDOM:ManakaiDOMNodeReference> objects.
96     @ImplNote:
97     @@lang:en
98     @@@:
99     A <Class::ManakaiDOM:ManakaiDOMNodeObject> is a blessed hash
100     reference. Each hash key and value pair is called as a
101     <DFN::property>. Currently, several core properties
102     are defined as listed below. Applications for this class,
103     including <Class::DOMCore:ManakaiDOMNode>, defines additional
104     properties for their purpose and scope.
105     \
106     {FIG:: Core node properties
107     \
108     - <CODE::TreeCore:nodeID>::: The global-unique identifier for
109     this node object.
110     \
111     - <CODE::TreeCore:treeID>::: The global-unique identifier for the
112     tree containing this node object.
113     \
114     - <CODE::TreeCore:rc>::: The number that denotes how many reference
115     to this node there are.
116     \
117     - <CODE::TreeCore:origin>::: An array reference, containing
118     hash key names of <DFN::origin>
119     properties for this node.
120     \
121 wakaba 1.3 - <CODE::TreeCore:subnode0>::: An array reference, containing
122     hash key names of <DFN::subnode>
123     properties for this node.
124     \
125 wakaba 1.1 - <CODE::TreeCore:subnode>::: An array reference, containing
126 wakaba 1.3 hash key names of <DFN::subnode> list
127 wakaba 1.1 properties for this node.
128     \
129     - <CODE::TreeCore:subnode2>::: An array reference, containing
130 wakaba 1.3 hash key names of <DFN::subnode> (two steps) list
131 wakaba 1.1 properties for this node.
132     \
133     - <CODE::TreeCore:irefnode>::: An array reference, containing
134     hash key names of <DFN::irefnode>
135     properties for this node.
136     \
137     - <CODE::TreeCore:anydata>::: An array reference, containing
138 wakaba 1.3 hash key names of <DFN::anydata> list
139     properties for this node.
140 wakaba 1.1 \
141     - <CODE::TreeCore:anydata2>::: An array reference, containing
142 wakaba 1.3 hash key names of <DFN::anydata> (two steps) list properties
143 wakaba 1.1 for this node.
144     \
145     }
146    
147     @IntMethod:
148     @@Name: new
149     @@Description:
150     @@@lang:en
151     @@@@:
152     Constructs a new instance of
153     <Class::ManakaiDOM:ManakaiDOMNodeObject> and returns it.
154     @@Return:
155     @@@Type:
156     ManakaiDOM:ManakaiDOMNodeObject
157     @@@Description:
158     @@@@lang:en
159     @@@@@:
160     The newly created <Class::ManakaiDOM:ManakaiDOMNodeObject> instance.
161 wakaba 1.7 @@@PerlDef:
162 wakaba 1.1 $r = bless {
163     <Q::TreeCore:origin> => [],
164 wakaba 1.3 <Q::TreeCore:subnode0> => [],
165 wakaba 1.1 <Q::TreeCore:subnode> => [],
166     <Q::TreeCore:subnode2> => [],
167     <Q::TreeCore:irefnode> => [],
168     <Q::TreeCore:anydata> => [],
169     <Q::TreeCore:anydata2> => [],
170     <Q::TreeCore:rc> => 0,
171     <Q::TreeCore:treeID> => <Code::ManakaiDOM:generateUniqueID>,
172     <Q::TreeCore:nodeID> => <Code::ManakaiDOM:generateUniqueID>,
173     }, ref $self || $self;
174     @IntMethod:
175     @@Name: newReference
176     @@Description:
177     @@@lang:en
178     @@@@:
179     Creates a new reference to this node and returns it.
180 wakaba 1.6 @@DISCore:isDeprecated:
181     @@@@:1
182     @@@DISCore:alt: getNewReference
183 wakaba 1.1 @@Param:
184     @@@Name: class
185     @@@Type:
186 wakaba 1.7 Perl:package-name::ManakaiDOM:all
187 wakaba 1.1 @@@Description:
188     @@@@lang:en
189     @@@@@:
190     A Perl class package name with which the newly created
191     reference is blessed. The <P::class> class must be a
192     subclass of <Class::ManakaiDOM:ManakaiDOM:ManakaiDOMNodeReference>.
193     @@Return:
194     @@@Type:
195     ManakaiDOM:ManakaiDOMNodeReference
196     @@@Description:
197     @@@@lang:en
198     @@@@@:
199     The newly created node reference.
200     @@@PerlDef:
201     $r = bless {
202     <Q::TreeCore:node> => $self,
203 wakaba 1.7 }, ref $class ? ref $class : defined $class ? $class :
204 wakaba 1.1 <ClassName::ManakaiDOM:ManakaiDOMNodeReference>;
205     $self->{<Q::TreeCore:rc>}++;
206 wakaba 1.6
207     @ResourceDef:
208     @@QName: getNewReference
209     @@rdf:type:
210     dis2pm:BlockCode
211     @@Description:
212     @@@lang:en
213     @@@@:
214     Creates a new node reference object.
215     @@ResourceDef:
216     @@@rdf:type:
217     DISPerl:CodeParameter
218     @@@Name: $object
219     @@@Type:
220     ManakaiDOM:ManakaiDOMNodeObject
221     @@@In:1
222     @@@enDesc:
223     A node object for which a reference is created.
224     @@@DISPerl:paramStyle: var
225     @@ResourceDef:
226     @@@rdf:type:
227     DISPerl:CodeParameter
228     @@@Name: $ref
229     @@@Type:
230     ManakaiDOM:ManakaiDOMNodeReferemce
231     @@@Out:1
232     @@@enDesc:
233     A node reference for <P::$object>. It may or may not
234     be same as <P::$object>.
235     @@@DISPerl:paramStyle: var
236     @@ResourceDef:
237     @@@rdf:type:
238     DISPerl:CodeParameter
239     @@@Name: $class
240     @@@Type:
241     Perl:package-name::ManakaiDOM:all
242     @@@enDesc:
243     A package name with which <P::$ref> is blessed.
244     @@@In:1
245     @@@DISPerl:paramStyle: any
246     @@PerlDef:
247     $object->{<Q::TreeCore:rc>}++;
248     $ref = bless {
249     <Q::TreeCore:node> => $object,
250     }, $class;
251    
252     @ResourceDef:
253     @@QName: getWeakReference
254     @@rdf:type:
255     dis2pm:BlockCode
256     @@Description:
257     @@@lang:en
258     @@@@:
259     Creates a new weak node reference object.
260     \
261     The weak node reference is actually a node reference
262     except that this code fragment does not increment
263     the reference count of the object. When all non-weak
264     references to the object are destructed, then
265     the object is destructed and any operation via
266     weak references will lead unexpected result.
267     \
268     {NOTE:: It is intended that internal code creates a weak reference
269     so that it gets access to public interface.
270     \
271     }
272     @@ResourceDef:
273     @@@rdf:type:
274     DISPerl:CodeParameter
275     @@@Name: $object
276     @@@Type:
277     ManakaiDOM:ManakaiDOMNodeObject
278     @@@In:1
279     @@@enDesc:
280     A node object for which a reference is created.
281     @@@DISPerl:paramStyle: var
282     @@ResourceDef:
283     @@@rdf:type:
284     DISPerl:CodeParameter
285     @@@Name: $ref
286     @@@Type:
287     ManakaiDOM:ManakaiDOMNodeReferemce
288     @@@Out:1
289     @@@enDesc:
290     A node reference for <P::$object>. It may or may not
291     be same as <P::$object>.
292     @@@DISPerl:paramStyle: var
293     @@ResourceDef:
294     @@@rdf:type:
295     DISPerl:CodeParameter
296     @@@Name: $class
297     @@@Type:
298     Perl:package-name::ManakaiDOM:all
299     @@@enDesc:
300     A package name with which <P::$ref> is blessed.
301     @@@In:1
302     @@@DISPerl:paramStyle: any
303     @@PerlDef:
304     $ref = bless {
305 wakaba 1.8 <Q::TreeCore:node> => $object,
306     <Q::TreeCore:isWeak> => true,
307     }, $class;
308    
309     @ResourceDef:
310     @@QName: getWeakRef
311     @@rdf:type:
312     dis2pm:InlineCode
313     @@Description:
314     @@@lang:en
315     @@@@:
316     Creates a new weak node reference object.
317     \
318     The weak node reference is actually a node reference
319     except that this code fragment does not increment
320     the reference count of the object. When all non-weak
321     references to the object are destructed, then
322     the object is destructed and any operation via
323     weak references will lead unexpected result.
324     \
325     {NOTE:: It is intended that internal code creates a weak reference
326     so that it gets access to public interface.
327     \
328     }
329     @@ResourceDef:
330     @@@rdf:type:
331     DISPerl:CodeParameter
332     @@@Name: $object
333     @@@Type:
334     ManakaiDOM:ManakaiDOMNodeObject
335     @@@In:1
336     @@@enDesc:
337     A node object for which a reference is created.
338     @@@DISPerl:paramStyle: var
339     @@ResourceDef:
340     @@@rdf:type:
341     DISPerl:CodeParameter
342     @@@Name: $class
343     @@@Type:
344     Perl:package-name::ManakaiDOM:all
345     @@@enDesc:
346     A package name with which <P::$ref> is blessed.
347     @@@In:1
348     @@@DISPerl:paramStyle: any
349     @@PerlDef:
350 wakaba 1.9 (bless {
351 wakaba 1.6 <Q::TreeCore:node> => $object,
352     <Q::TreeCore:isWeak> => true,
353 wakaba 1.9 }, $class)
354 wakaba 1.6
355 wakaba 1.1 @IntMethod:
356     @@Name: isExternallyReferred
357     @@Description:
358     @@@lang:en
359     @@@@:
360     Checks whether the tree containing this node has been referred
361     from the outside of the tree or not.
362     @@Return:
363     @@@Type:
364 wakaba 1.7 DISPerl:Boolean::ManakaiDOM:all
365 wakaba 1.1 @@@InCase:
366     @@@@Value: true
367     @@@@Type:
368 wakaba 1.7 DISPerl:Boolean::ManakaiDOM:all
369 wakaba 1.1 @@@@Description:
370     @@@@@lang:en
371     @@@@@@:
372     There is one or more nodes in the tree that has been
373     referred via <Class::ManakaiDOM:ManakaiDOMNodeReference> objects.
374     @@@InCase:
375     @@@@Value: false
376     @@@@Type:
377 wakaba 1.7 DISPerl:Boolean::ManakaiDOM:all
378 wakaba 1.1 @@@@Description:
379     @@@@@lang:en
380     @@@@@@: No external reference found.
381     @@@PerlDef:
382     if ($self->{<Q::TreeCore:rc>}) {
383     $r = true;
384     } else {
385     my @node = ($self);
386     my %checked;
387     NODES: while (my $node = shift @node) {
388 wakaba 1.9 next unless UNIVERSAL::isa ($node,
389     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>);
390 wakaba 1.1 if ($node->{<Q::TreeCore:rc>}) {
391     $r = true;
392     last NODES;
393     } elsif ($checked{$node->{<Q::TreeCore:nodeID>}}) {
394     next NODES;
395     }
396     my @n;
397 wakaba 1.3 for my $p (@{$node->{<Q::TreeCore:subnode2>}}) {
398     if (ref $node->{$p} eq 'ARRAY') {
399     push @n, @{$node->{$p}};
400     } elsif (ref $node->{$p} eq 'HASH') {
401     push @n, values %{$node->{$p}};
402 wakaba 1.1 }
403     }
404 wakaba 1.3 for my $p (@n,
405     map {$node->{$_}} @{$node->{<Q::TreeCore:subnode>}}) {
406     if (ref $p eq 'ARRAY') {
407     push @node, @$p;
408     } elsif (ref $p eq 'HASH') {
409     push @node, values %$p;
410 wakaba 1.1 }
411     }
412 wakaba 1.6 for my $p (@{$node->{<Q::TreeCore:origin>}}) {
413     unshift @node, $node->{$p} if $node->{$p};
414     ## NOTE: Puts the top of the list,
415     ## since upper-level nodes are expected to be referred
416     ## more than lower-levels.
417     }
418     for my $p (@{$node->{<Q::TreeCore:subnode0>}}) {
419 wakaba 1.3 push @node, $node->{$p} if $node->{$p};
420 wakaba 1.1 }
421     $checked{$node->{<Q::TreeCore:nodeID>}} = 1;
422     }
423     }
424    
425     @IntMethod:
426     @@Name: destroy
427     @@Description:
428     @@@lang:en
429     @@@@:
430     Destructs the tree containing this node.
431     @@Return:
432     @@@PerlDef:
433     my @node = ($self);
434     NODES: while (my $node = shift @node) {
435     my @n;
436 wakaba 1.3 for my $p (@{$node->{<Q::TreeCore:subnode2>}}) {
437     if (ref $node->{$p} eq 'ARRAY') {
438     push @n, @{$node->{$p}};
439     } elsif (ref $node->{$p} eq 'HASH') {
440     push @n, values %{$node->{$p}};
441 wakaba 1.1 }
442     }
443 wakaba 1.3 for my $p (@n,
444     map {$node->{$_}} @{$node->{<Q::TreeCore:subnode>}}) {
445     if (ref $p eq 'ARRAY') {
446 wakaba 1.5 push @node, grep {ref $_ eq
447     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>
448     and defined $_->{<Q::TreeCore:nodeID>}} @$p;
449 wakaba 1.3 } elsif (ref $p eq 'HASH') {
450 wakaba 1.5 push @node, grep {ref $_ eq
451     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>
452     and defined $_->{<Q::TreeCore:nodeID>}}
453 wakaba 1.3 values %$p;
454 wakaba 1.1 }
455     }
456 wakaba 1.3 for my $p (@{$node->{<Q::TreeCore:origin>}},
457     \ @{$node->{<Q::TreeCore:subnode0>}}) {
458     push @node, $node->{$p}
459     if defined $node->{$p} and
460     defined $node->{$p}->{<Q::TreeCore:nodeID>};
461 wakaba 1.1 }
462     %$node = ();
463     }
464     @@ImplNote:
465     @@@lang:en
466     @@@@:
467     This method is different from Perl <Perl::DESTROY> special
468     purpose method.
469     \
470     An <QUOTE::uninitialized> warning in this method might mean
471     some method puts an <Perl::undef> into a list of nodes.
472    
473     @IntMethod:
474     @@Name: importTree
475     @@Description:
476     @@@lang:en
477     @@@@:
478     Changes the tree identifier of the nodes belong to another tree
479     to be same as this node's tree identifier.
480     @@Param:
481     @@@Name: node
482     @@@Type:
483     ManakaiDOM:ManakaiDOMNodeObject
484     @@@Description:
485     @@@@lang:en
486     @@@@@:
487     Any node from the tree to change its identifier.
488     @@Return:
489     @@@PerlDef:
490     unless ($node->{<Q::TreeCore:treeID>} eq
491     $self->{<Q::TreeCore:treeID>}) {
492     my @node = ($node);
493     NODES: while (my $node = shift @node) {
494 wakaba 1.5 next unless ref $node eq
495     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>;
496 wakaba 1.1 my @n;
497 wakaba 1.3 for my $p (@{$node->{<Q::TreeCore:subnode2>}}) {
498     if (ref $node->{$p} eq 'ARRAY') {
499     push @n, @{$node->{$p}};
500     } elsif (ref $node->{$p} eq 'HASH') {
501     push @n, values %{$node->{$p}};
502 wakaba 1.1 }
503     }
504 wakaba 1.3 for my $p (@n,
505     map {$node->{$_}} @{$node->{<Q::TreeCore:subnode>}}) {
506     if (ref $p eq 'ARRAY') {
507 wakaba 1.9 push @node, grep {UNIVERSAL::isa ($_,
508     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>)
509 wakaba 1.5 and $_->{<Q::TreeCore:treeID>} ne
510 wakaba 1.3 $self->{<Q::TreeCore:treeID>}} @$p;
511     } elsif (ref $p eq 'HASH') {
512 wakaba 1.9 push @node, grep {UNIVERSAL::isa ($_,
513     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>)
514 wakaba 1.5 and $_->{<Q::TreeCore:treeID>} ne
515 wakaba 1.1 $self->{<Q::TreeCore:treeID>}}
516 wakaba 1.3 values %$p;
517 wakaba 1.1 }
518     }
519 wakaba 1.3 for my $p (@{$node->{<Q::TreeCore:origin>}},
520     \ @{$node->{<Q::TreeCore:subnode0>}}) {
521     push @node, $node->{$p}
522     if defined $node->{$p} and
523     $node->{$p}->{<Q::TreeCore:treeID>} ne
524 wakaba 1.1 $self->{<Q::TreeCore:treeID>};
525     }
526     $node->{<Q::TreeCore:treeID>} = $self->{<Q::TreeCore:treeID>};
527     }
528     }
529    
530     @IntMethod:
531     @@Name: changeTreeID
532     @@Description:
533     @@@lang:en
534     @@@@:
535     Changes tree identifier of all nodes traversable from this node.
536     @@Param:
537     @@@Name: treeID
538     @@@Type:
539 wakaba 1.7 DISPerl:String::ManakaiDOM:all
540 wakaba 1.1 @@@Description:
541     @@@@lang:en
542     @@@@@:
543     The new tree identifier.
544     @@Return:
545     @@@PerlDef:
546     unless ($self->{<Q::TreeCore:treeID>} eq $treeID) {
547     my @node = ($self);
548     NODES: while (my $node = shift @node) {
549 wakaba 1.9 next unless UNIVERSAL::isa ($node,
550     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>);
551 wakaba 1.1 my @n;
552 wakaba 1.3 for my $p (@{$node->{<Q::TreeCore:subnode2>}}) {
553     if (ref $node->{$p} eq 'ARRAY') {
554     push @n, @{$node->{$p}};
555     } elsif (ref $node->{$p} eq 'HASH') {
556     push @n, values %{$node->{$p}};
557 wakaba 1.1 }
558     }
559 wakaba 1.3 for my $p (@n,
560     map {$node->{$_}} @{$node->{<Q::TreeCore:subnode>}}) {
561     if (ref $p eq 'ARRAY') {
562 wakaba 1.9 push @node, grep {UNIVERSAL::isa ($_,
563     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>)
564 wakaba 1.5 and
565     $_->{<Q::TreeCore:treeID>} ne $treeID} @$p;
566 wakaba 1.3 } elsif (ref $p eq 'HASH') {
567 wakaba 1.9 push @node, grep {UNIVERSAL::isa ($_,
568     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>)
569 wakaba 1.5 and $_->{<Q::TreeCore:treeID>} ne $treeID}
570 wakaba 1.3 values %$p;
571 wakaba 1.1 }
572     }
573 wakaba 1.3 for my $p (@{$node->{<Q::TreeCore:origin>}},
574     \ @{$node->{<Q::TreeCore:subnode0>}}) {
575     push @node, $node->{$p}
576     if defined $node->{$p} and
577     $node->{$p}->{<Q::TreeCore:treeID>} ne $treeID;
578 wakaba 1.1 }
579     $node->{<Q::TreeCore:treeID>} = $treeID;
580     }
581     }
582    
583     @IntMethod:
584     @@Name: getRootNodes
585     @@Description:
586     @@@lang:en
587     @@@@:
588     Gets root nodes in the tree to which this node belongs,
589     at <QUOTE::higher> level than this node.
590     \
591     {NOTE:: The manakai internal tree structure may have more than
592     one tree root node - it is a set of tree sharing their
593     nodes rather than a single tree. In this method
594     <DFN::root nodes> is defined as the nodes that
595     have no their <QUOTE::origin> node. There is at least
596     one such node by definition of the manakai tree structure.
597     <QUOTE::Higher> in this context means that the node is reachable
598     by only traversing <QUOTE::origin> relationships from this node.
599     \
600     }
601     @@Return:
602     @@@Type:
603 wakaba 1.7 Perl:ARRAY::ManakaiDOM:all
604 wakaba 1.1 @@@PerlDef:
605     my %result;
606     my @node = ($self);
607     NODES: while (my $node = shift @node) {
608     my $i = 0;
609 wakaba 1.3 ORIGINS: for my $o (@{$node->{<Q::TreeCore:origin>}}) {
610     next ORIGINS unless $node->{$o};
611 wakaba 1.1 $i++;
612 wakaba 1.3 push @node, $node->{$o};
613 wakaba 1.1 }
614     if ($i == 0) {
615     $result{$node->{<Q::TreeCore:nodeID>}} = $node;
616     }
617     }
618     \ @$r = (grep {defined $_->{<Q::TreeCore:nodeID>}} values %result);
619    
620     @IntMethod:
621     @@Name: isSameNode
622     @@Description:
623     @@@lang:en
624     @@@@:
625     Returns whether a node is the same as this node or not.
626     \
627     {NOTE:: The sameness is different from the equality;
628     two nodes are same iff they are same hash reference.
629     \
630     }
631     @@Operator:
632     @@@ContentType:
633     lang:Perl
634     @@@@: eq
635     @@Param:
636     @@@Name: node
637     @@@Type:
638     ManakaiDOM:ManakaiDOMNodeObject
639     @@@Description:
640     @@@@lang:en
641     @@@@@:
642     A node to compare with.
643     @@Return:
644     @@@Type:
645 wakaba 1.7 DISPerl:Boolean::ManakaiDOM:all
646 wakaba 1.1 @@@Description:
647     @@@@lang:en
648     @@@@@: Whether the two nodes are same or not.
649     @@@PerlDef:
650     if (ref $node and
651     UNIVERSAL::isa ($node,
652     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>) and
653     $node->{<Q::TreeCore:nodeID>} eq $self->{<Q::TreeCore:nodeID>}) {
654     $r = true;
655     }
656     @IntMethod:
657     @@Name: orphanate
658     @@Description:
659     @@@lang:en
660     @@@@:
661     Notifies that this node (and its neibors if any) is no longer
662     part of the main tree. If the new tree containing this node
663     has been referred yet, then the tree is preserved except its
664     tree identifier has changed. Otherwise, i.e. the tree is
665     useless any more, then it is destructed.
666     \
667     {NOTE:: Interaction on deleting a relationship from multiply
668     organized <QUOTE::trees> (such as DOM tree and
669     styled displaying tree) is less studied. This
670     method might be modified or addition of another method(s)
671     might be required when style sheet, XBL, or other
672     technologies has been implemented.
673     \
674     }
675     @@Return:
676     @@@PerlDef:
677     if ($self-><M::ManakaiDOM:ManakaiDOMNodeObject.isExternallyReferred>) {
678     $self-><M::ManakaiDOM:ManakaiDOMNodeObject.changeTreeID>
679     (<Code::ManakaiDOM:generateUniqueID>);
680     } else {
681     $self-><M::ManakaiDOM:ManakaiDOMNodeObject.destroy>;
682     }
683     ##Class:ManakaiDOMNodeObject
684    
685     ## -- Public node object
686    
687     ClassDef:
688     @QName:
689     ManakaiDOM:ManakaiDOMNodeReference
690     @Description:
691     @@lang:en
692     @@@:
693     References to the node object corresponding to it. From
694     applications' view, any node object is hidden and
695     <Class::ManakaiDOM:ManakaiDOMNodeReference> seems as if
696     the node itself.
697     @ImplNote:
698     @@lang:en
699     @@@:
700     A <Class::ManakaiDOM:ManakaiDOMNodeReference> is a blessed hash
701     reference; currently there is a hash key defined:
702     \
703     - <CODE::TreeCore:node>::: A node object
704     (<Class::ManakaiDOM:ManakaiDOMNodeObject>) to which
705     this is referring.
706    
707     @IntMethod:
708     @@Name: destroy
709     @@Description:
710     @@@lang:en
711     @@@@: Destroy this reference object.
712     @@Operator:
713     @@@ContentType:
714     lang:Perl
715     @@@@: DESTROY
716     @@Return:
717     @@@PerlDef:
718     @@@@@:
719     my $node = $self->{<Q::TreeCore:node>};
720     if ($node) {
721     CORE::delete $self->{<Q::TreeCore:node>};
722 wakaba 1.6 unless ($self->{<Q::TreeCore:isWeak>}) {
723     $node->{<Q::TreeCore:rc>}--;
724     unless ($node-><M::ManakaiDOM:ManakaiDOMNodeObject
725     .isExternallyReferred>) {
726     $node-><M::ManakaiDOM:ManakaiDOMNodeObject.destroy>;
727     }
728 wakaba 1.1 }
729     } else {
730     warn ref ($self) . q{->DESTROY: there is no associated }.
731     q{node object - you have a global variable or }.
732     qq{potential memory-leak detected\n};
733     }
734     @@@@ImplNote:
735     @@@@@lang:en
736     @@@@@@:
737     {P::Warning during the global destruction might mean:
738     \
739     - there be a loop in the manakai internal implementation -
740     it should be a bug.
741     \
742     - there be a loop created by application, e.g.
743     event handler containing a reference to any node
744     belonging to the same tree.
745     \
746     - there be a global variable that contains a node reference
747     and it is not altered or <Perl::undef>ed until the global
748     destruction.
749     \
750     - or other unknown bad situation.
751     \
752     }
753     @@ImplNote:
754     @@@lang:en
755     @@@@:
756     Don't override this method unintentionally - for example,
757     inheritting <PerlModule::Tie::Array> would hide this method
758     from that class, since that module defines its own
759     destructor.
760     ##Class:ManakaiDOMNodeReference
761 wakaba 1.6
762     PropDef:
763     @QName: isWeak
764     @enDesc:
765     Whether a reference is weak or not.
766     @rdfs:range:
767     ManakaiDOM:ManakaiDONNodeReference
768     @Type:
769     DOMMain:boolean::ManakaiDOM:all
770    
771     ElementTypeBinding:
772     @Name:PropDef
773     @ElementType:
774     dis:ResourceDef
775     @ShadowContent:
776     @@rdf:type:
777     rdf:Property
778    
779     ElementTypeBinding:
780     @Name:enDesc
781     @ElementType:
782     dis:Description
783     @ShadowContent:
784     @@lang:en
785 wakaba 1.1
786     ## -- Frequently used code fragments
787    
788     ResourceDef:
789     @QName:
790     ManakaiDOM:generateUniqueID
791     @rdf:type:
792     dis2pm:InlineCode
793     @Description:
794     @@lang:en
795     @@@:
796     Generates a global-unique opaque string.
797     \
798     {NOTE:: A URI reference is generated by this code.
799     \
800     }
801     @AliasFor:
802     @@@:
803     ::ManakaiDOM:all
804     @@For:
805     !=ManakaiDOM:all
806     @PerlDef:
807     (
808     sprintf 'mid:%d.%d.%s.dom.manakai@suika.fam.cx#',
809     time, $$,
810     ['A'..'Z', 'a'..'z', '0'..'9']->[rand 62] .
811     ['A'..'Z', 'a'..'z', '0'..'9']->[rand 62] .
812     ['A'..'Z', 'a'..'z', '0'..'9']->[rand 62] .
813     ['A'..'Z', 'a'..'z', '0'..'9']->[rand 62] .
814     ['A'..'Z', 'a'..'z', '0'..'9']->[rand 62]
815     )
816     ##ManakaiDOM:generateUniqueID
817    
818     ## -- lang:dis vocabulary
819    
820     TreeElementType:
821     @QName:
822     dis:GetProp
823     @dataType:
824     dis:TypeQName
825     @rdfs:range:
826     rdf:Property
827     @Description:
828     @@lang:en
829     @@@:
830     Gets the non-nodal value of a <Class::ManakaiDOM:ManakaiDOMNodeReference>
831     property (actualy <Class::ManakaiDOM:ManakaiDOMNodeObject> property).
832    
833     TreeElementType:
834     @QName:
835     dis:SetProp
836     @dataType:
837     dis:TypeQName
838     @rdfs:range:
839     rdf:Property
840     @Description:
841     @@lang:en
842     @@@:
843     Sets the non-nodal value of a <Class::ManakaiDOM:ManakaiDOMNodeReference>
844     property (actualy <Class::ManakaiDOM:ManakaiDOMNodeObject> property).
845    
846     ## -- Syntax sugar
847    
848     ElementTypeBinding:
849     @Name: TreeElementType
850     @ElementType:
851     dis:ResourceDef
852     @ShadowContent:
853     @@rdf:type:
854     DISLang:TreeElementType
855     @@AliasFor:
856     @@@@:
857     ::ManakaiDOM:all
858     @@@For:
859     !=ManakaiDOM:all
860    
861     ElementTypeBinding:
862     @Name: ClassDef
863     @ElementType:
864     dis:ResourceDef
865     @ShadowContent:
866     @@rdf:type:
867     ManakaiDOM:Class
868     @@AliasFor:
869     @@@@:
870 wakaba 1.2 ::ManakaiDOM:Perl
871 wakaba 1.1 @@@For:
872 wakaba 1.2 !=ManakaiDOM:Perl
873     @@ForCheck:
874     ManakaiDOM:Perl
875 wakaba 1.1
876     ElementTypeBinding:
877     @Name: IntMethod
878     @ElementType:
879     dis:ResourceDef
880     @ShadowContent:
881     @@rdf:type:
882     DISLang:Method
883     @@ManakaiDOM:isForInternal:1
884    
885     ElementTypeBinding:
886     @Name: Return
887     @ElementType:
888     dis:ResourceDef
889     @ShadowContent:
890     @@rdf:type:
891     DISLang:MethodReturn
892    
893     ElementTypeBinding:
894     @Name: Param
895     @ElementType:
896     dis:ResourceDef
897     @ShadowContent:
898     @@rdf:type:
899     DISLang:MethodParameter
900    
901     ElementTypeBinding:
902     @Name: PerlDef
903     @ElementType:
904     dis:Def
905     @ShadowContent:
906     @@ContentType:
907     lang:Perl
908    
909     ElementTypeBinding:
910     @Name: InCase
911     @ElementType:
912     dis:ResourceDef
913     @ShadowContent:
914     @@rdf:type:
915     ManakaiDOM:InCase
916    
917     ## ManakaiNode.dis ends here

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24