/[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.6 - (hide annotations) (download)
Wed Mar 16 09:08:14 2005 UTC (20 years, 4 months ago) by wakaba
Branch: MAIN
Changes since 1.5: +144 -8 lines
Perl inline preprocessing implemented (but not tested whether it does work or not)

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.6 $Date: 2005/03/04 12:18:52 $
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     @@@PerlDef:
162     $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     Perl:package-name
187     @@@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     }, ref $class ? ref $class : $class ? $class :
204     <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     <Q::TreeCore:node> => $object,
306     <Q::TreeCore:isWeak> => true,
307     }, $class;
308    
309 wakaba 1.1 @IntMethod:
310     @@Name: isExternallyReferred
311     @@Description:
312     @@@lang:en
313     @@@@:
314     Checks whether the tree containing this node has been referred
315     from the outside of the tree or not.
316     @@Return:
317     @@@Type:
318     DISPerl:Boolean
319     @@@InCase:
320     @@@@Value: true
321     @@@@Type:
322     DISPerl:Boolean
323     @@@@Description:
324     @@@@@lang:en
325     @@@@@@:
326     There is one or more nodes in the tree that has been
327     referred via <Class::ManakaiDOM:ManakaiDOMNodeReference> objects.
328     @@@InCase:
329     @@@@Value: false
330     @@@@Type:
331     DISPerl:Boolean
332     @@@@Description:
333     @@@@@lang:en
334     @@@@@@: No external reference found.
335     @@@PerlDef:
336     if ($self->{<Q::TreeCore:rc>}) {
337     $r = true;
338     } else {
339     my @node = ($self);
340     my %checked;
341     NODES: while (my $node = shift @node) {
342 wakaba 1.5 next unless ref $node eq
343     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>;
344 wakaba 1.1 if ($node->{<Q::TreeCore:rc>}) {
345     $r = true;
346     last NODES;
347     } elsif ($checked{$node->{<Q::TreeCore:nodeID>}}) {
348     next NODES;
349     }
350     my @n;
351 wakaba 1.3 for my $p (@{$node->{<Q::TreeCore:subnode2>}}) {
352     if (ref $node->{$p} eq 'ARRAY') {
353     push @n, @{$node->{$p}};
354     } elsif (ref $node->{$p} eq 'HASH') {
355     push @n, values %{$node->{$p}};
356 wakaba 1.1 }
357     }
358 wakaba 1.3 for my $p (@n,
359     map {$node->{$_}} @{$node->{<Q::TreeCore:subnode>}}) {
360     if (ref $p eq 'ARRAY') {
361     push @node, @$p;
362     } elsif (ref $p eq 'HASH') {
363     push @node, values %$p;
364 wakaba 1.1 }
365     }
366 wakaba 1.6 for my $p (@{$node->{<Q::TreeCore:origin>}}) {
367     unshift @node, $node->{$p} if $node->{$p};
368     ## NOTE: Puts the top of the list,
369     ## since upper-level nodes are expected to be referred
370     ## more than lower-levels.
371     }
372     for my $p (@{$node->{<Q::TreeCore:subnode0>}}) {
373 wakaba 1.3 push @node, $node->{$p} if $node->{$p};
374 wakaba 1.1 }
375     $checked{$node->{<Q::TreeCore:nodeID>}} = 1;
376     }
377     }
378    
379     @IntMethod:
380     @@Name: destroy
381     @@Description:
382     @@@lang:en
383     @@@@:
384     Destructs the tree containing this node.
385     @@Return:
386     @@@PerlDef:
387     my @node = ($self);
388     NODES: while (my $node = shift @node) {
389     my @n;
390 wakaba 1.3 for my $p (@{$node->{<Q::TreeCore:subnode2>}}) {
391     if (ref $node->{$p} eq 'ARRAY') {
392     push @n, @{$node->{$p}};
393     } elsif (ref $node->{$p} eq 'HASH') {
394     push @n, values %{$node->{$p}};
395 wakaba 1.1 }
396     }
397 wakaba 1.3 for my $p (@n,
398     map {$node->{$_}} @{$node->{<Q::TreeCore:subnode>}}) {
399     if (ref $p eq 'ARRAY') {
400 wakaba 1.5 push @node, grep {ref $_ eq
401     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>
402     and defined $_->{<Q::TreeCore:nodeID>}} @$p;
403 wakaba 1.3 } elsif (ref $p eq 'HASH') {
404 wakaba 1.5 push @node, grep {ref $_ eq
405     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>
406     and defined $_->{<Q::TreeCore:nodeID>}}
407 wakaba 1.3 values %$p;
408 wakaba 1.1 }
409     }
410 wakaba 1.3 for my $p (@{$node->{<Q::TreeCore:origin>}},
411     \ @{$node->{<Q::TreeCore:subnode0>}}) {
412     push @node, $node->{$p}
413     if defined $node->{$p} and
414     defined $node->{$p}->{<Q::TreeCore:nodeID>};
415 wakaba 1.1 }
416     %$node = ();
417     }
418     @@ImplNote:
419     @@@lang:en
420     @@@@:
421     This method is different from Perl <Perl::DESTROY> special
422     purpose method.
423     \
424     An <QUOTE::uninitialized> warning in this method might mean
425     some method puts an <Perl::undef> into a list of nodes.
426    
427     @IntMethod:
428     @@Name: importTree
429     @@Description:
430     @@@lang:en
431     @@@@:
432     Changes the tree identifier of the nodes belong to another tree
433     to be same as this node's tree identifier.
434     @@Param:
435     @@@Name: node
436     @@@Type:
437     ManakaiDOM:ManakaiDOMNodeObject
438     @@@Description:
439     @@@@lang:en
440     @@@@@:
441     Any node from the tree to change its identifier.
442     @@Return:
443     @@@PerlDef:
444     unless ($node->{<Q::TreeCore:treeID>} eq
445     $self->{<Q::TreeCore:treeID>}) {
446     my @node = ($node);
447     NODES: while (my $node = shift @node) {
448 wakaba 1.5 next unless ref $node eq
449     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>;
450 wakaba 1.1 my @n;
451 wakaba 1.3 for my $p (@{$node->{<Q::TreeCore:subnode2>}}) {
452     if (ref $node->{$p} eq 'ARRAY') {
453     push @n, @{$node->{$p}};
454     } elsif (ref $node->{$p} eq 'HASH') {
455     push @n, values %{$node->{$p}};
456 wakaba 1.1 }
457     }
458 wakaba 1.3 for my $p (@n,
459     map {$node->{$_}} @{$node->{<Q::TreeCore:subnode>}}) {
460     if (ref $p eq 'ARRAY') {
461 wakaba 1.5 push @node, grep {ref $_ eq
462     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>
463     and $_->{<Q::TreeCore:treeID>} ne
464 wakaba 1.3 $self->{<Q::TreeCore:treeID>}} @$p;
465     } elsif (ref $p eq 'HASH') {
466 wakaba 1.5 push @node, grep {ref $_ eq
467     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>
468     and $_->{<Q::TreeCore:treeID>} ne
469 wakaba 1.1 $self->{<Q::TreeCore:treeID>}}
470 wakaba 1.3 values %$p;
471 wakaba 1.1 }
472     }
473 wakaba 1.3 for my $p (@{$node->{<Q::TreeCore:origin>}},
474     \ @{$node->{<Q::TreeCore:subnode0>}}) {
475     push @node, $node->{$p}
476     if defined $node->{$p} and
477     $node->{$p}->{<Q::TreeCore:treeID>} ne
478 wakaba 1.1 $self->{<Q::TreeCore:treeID>};
479     }
480     $node->{<Q::TreeCore:treeID>} = $self->{<Q::TreeCore:treeID>};
481     }
482     }
483    
484     @IntMethod:
485     @@Name: changeTreeID
486     @@Description:
487     @@@lang:en
488     @@@@:
489     Changes tree identifier of all nodes traversable from this node.
490     @@Param:
491     @@@Name: treeID
492     @@@Type:
493     DISPerl:String
494     @@@Description:
495     @@@@lang:en
496     @@@@@:
497     The new tree identifier.
498     @@Return:
499     @@@PerlDef:
500     unless ($self->{<Q::TreeCore:treeID>} eq $treeID) {
501     my @node = ($self);
502     NODES: while (my $node = shift @node) {
503 wakaba 1.5 next unless ref $node eq
504     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>;
505 wakaba 1.1 my @n;
506 wakaba 1.3 for my $p (@{$node->{<Q::TreeCore:subnode2>}}) {
507     if (ref $node->{$p} eq 'ARRAY') {
508     push @n, @{$node->{$p}};
509     } elsif (ref $node->{$p} eq 'HASH') {
510     push @n, values %{$node->{$p}};
511 wakaba 1.1 }
512     }
513 wakaba 1.3 for my $p (@n,
514     map {$node->{$_}} @{$node->{<Q::TreeCore:subnode>}}) {
515     if (ref $p eq 'ARRAY') {
516 wakaba 1.5 push @node, grep {ref $_ eq
517     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>
518     and
519     $_->{<Q::TreeCore:treeID>} ne $treeID} @$p;
520 wakaba 1.3 } elsif (ref $p eq 'HASH') {
521 wakaba 1.5 push @node, grep {ref $_ eq
522     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>
523     and $_->{<Q::TreeCore:treeID>} ne $treeID}
524 wakaba 1.3 values %$p;
525 wakaba 1.1 }
526     }
527 wakaba 1.3 for my $p (@{$node->{<Q::TreeCore:origin>}},
528     \ @{$node->{<Q::TreeCore:subnode0>}}) {
529     push @node, $node->{$p}
530     if defined $node->{$p} and
531     $node->{$p}->{<Q::TreeCore:treeID>} ne $treeID;
532 wakaba 1.1 }
533     $node->{<Q::TreeCore:treeID>} = $treeID;
534     }
535     }
536    
537     @IntMethod:
538     @@Name: getRootNodes
539     @@Description:
540     @@@lang:en
541     @@@@:
542     Gets root nodes in the tree to which this node belongs,
543     at <QUOTE::higher> level than this node.
544     \
545     {NOTE:: The manakai internal tree structure may have more than
546     one tree root node - it is a set of tree sharing their
547     nodes rather than a single tree. In this method
548     <DFN::root nodes> is defined as the nodes that
549     have no their <QUOTE::origin> node. There is at least
550     one such node by definition of the manakai tree structure.
551     <QUOTE::Higher> in this context means that the node is reachable
552     by only traversing <QUOTE::origin> relationships from this node.
553     \
554     }
555     @@Return:
556     @@@Type:
557     Perl:ARRAY
558     @@@PerlDef:
559     my %result;
560     my @node = ($self);
561     NODES: while (my $node = shift @node) {
562     my $i = 0;
563 wakaba 1.3 ORIGINS: for my $o (@{$node->{<Q::TreeCore:origin>}}) {
564     next ORIGINS unless $node->{$o};
565 wakaba 1.1 $i++;
566 wakaba 1.3 push @node, $node->{$o};
567 wakaba 1.1 }
568     if ($i == 0) {
569     $result{$node->{<Q::TreeCore:nodeID>}} = $node;
570     }
571     }
572     \ @$r = (grep {defined $_->{<Q::TreeCore:nodeID>}} values %result);
573    
574     @IntMethod:
575     @@Name: isSameNode
576     @@Description:
577     @@@lang:en
578     @@@@:
579     Returns whether a node is the same as this node or not.
580     \
581     {NOTE:: The sameness is different from the equality;
582     two nodes are same iff they are same hash reference.
583     \
584     }
585     @@Operator:
586     @@@ContentType:
587     lang:Perl
588     @@@@: eq
589     @@Param:
590     @@@Name: node
591     @@@Type:
592     ManakaiDOM:ManakaiDOMNodeObject
593     @@@Description:
594     @@@@lang:en
595     @@@@@:
596     A node to compare with.
597     @@Return:
598     @@@Type:
599     DISPerl:Boolean
600     @@@Description:
601     @@@@lang:en
602     @@@@@: Whether the two nodes are same or not.
603     @@@PerlDef:
604     if (ref $node and
605     UNIVERSAL::isa ($node,
606     <ClassName::ManakaiDOM:ManakaiDOMNodeObject>) and
607     $node->{<Q::TreeCore:nodeID>} eq $self->{<Q::TreeCore:nodeID>}) {
608     $r = true;
609     }
610     @IntMethod:
611     @@Name: orphanate
612     @@Description:
613     @@@lang:en
614     @@@@:
615     Notifies that this node (and its neibors if any) is no longer
616     part of the main tree. If the new tree containing this node
617     has been referred yet, then the tree is preserved except its
618     tree identifier has changed. Otherwise, i.e. the tree is
619     useless any more, then it is destructed.
620     \
621     {NOTE:: Interaction on deleting a relationship from multiply
622     organized <QUOTE::trees> (such as DOM tree and
623     styled displaying tree) is less studied. This
624     method might be modified or addition of another method(s)
625     might be required when style sheet, XBL, or other
626     technologies has been implemented.
627     \
628     }
629     @@Return:
630     @@@PerlDef:
631     if ($self-><M::ManakaiDOM:ManakaiDOMNodeObject.isExternallyReferred>) {
632     $self-><M::ManakaiDOM:ManakaiDOMNodeObject.changeTreeID>
633     (<Code::ManakaiDOM:generateUniqueID>);
634     } else {
635     $self-><M::ManakaiDOM:ManakaiDOMNodeObject.destroy>;
636     }
637     ##Class:ManakaiDOMNodeObject
638    
639     ## -- Public node object
640    
641     ClassDef:
642     @QName:
643     ManakaiDOM:ManakaiDOMNodeReference
644     @Description:
645     @@lang:en
646     @@@:
647     References to the node object corresponding to it. From
648     applications' view, any node object is hidden and
649     <Class::ManakaiDOM:ManakaiDOMNodeReference> seems as if
650     the node itself.
651     @ImplNote:
652     @@lang:en
653     @@@:
654     A <Class::ManakaiDOM:ManakaiDOMNodeReference> is a blessed hash
655     reference; currently there is a hash key defined:
656     \
657     - <CODE::TreeCore:node>::: A node object
658     (<Class::ManakaiDOM:ManakaiDOMNodeObject>) to which
659     this is referring.
660    
661     @IntMethod:
662     @@Name: destroy
663     @@Description:
664     @@@lang:en
665     @@@@: Destroy this reference object.
666     @@Operator:
667     @@@ContentType:
668     lang:Perl
669     @@@@: DESTROY
670     @@Return:
671     @@@PerlDef:
672     @@@@@:
673     my $node = $self->{<Q::TreeCore:node>};
674     if ($node) {
675     CORE::delete $self->{<Q::TreeCore:node>};
676 wakaba 1.6 unless ($self->{<Q::TreeCore:isWeak>}) {
677     $node->{<Q::TreeCore:rc>}--;
678     unless ($node-><M::ManakaiDOM:ManakaiDOMNodeObject
679     .isExternallyReferred>) {
680     $node-><M::ManakaiDOM:ManakaiDOMNodeObject.destroy>;
681     }
682 wakaba 1.1 }
683     } else {
684     warn ref ($self) . q{->DESTROY: there is no associated }.
685     q{node object - you have a global variable or }.
686     qq{potential memory-leak detected\n};
687     }
688     @@@@ImplNote:
689     @@@@@lang:en
690     @@@@@@:
691     {P::Warning during the global destruction might mean:
692     \
693     - there be a loop in the manakai internal implementation -
694     it should be a bug.
695     \
696     - there be a loop created by application, e.g.
697     event handler containing a reference to any node
698     belonging to the same tree.
699     \
700     - there be a global variable that contains a node reference
701     and it is not altered or <Perl::undef>ed until the global
702     destruction.
703     \
704     - or other unknown bad situation.
705     \
706     }
707     @@ImplNote:
708     @@@lang:en
709     @@@@:
710     Don't override this method unintentionally - for example,
711     inheritting <PerlModule::Tie::Array> would hide this method
712     from that class, since that module defines its own
713     destructor.
714     ##Class:ManakaiDOMNodeReference
715 wakaba 1.6
716     PropDef:
717     @QName: isWeak
718     @enDesc:
719     Whether a reference is weak or not.
720     @rdfs:range:
721     ManakaiDOM:ManakaiDONNodeReference
722     @Type:
723     DOMMain:boolean::ManakaiDOM:all
724    
725     ElementTypeBinding:
726     @Name:PropDef
727     @ElementType:
728     dis:ResourceDef
729     @ShadowContent:
730     @@rdf:type:
731     rdf:Property
732    
733     ElementTypeBinding:
734     @Name:enDesc
735     @ElementType:
736     dis:Description
737     @ShadowContent:
738     @@lang:en
739 wakaba 1.1
740     ## -- Frequently used code fragments
741    
742     ResourceDef:
743     @QName:
744     ManakaiDOM:generateUniqueID
745     @rdf:type:
746     dis2pm:InlineCode
747     @Description:
748     @@lang:en
749     @@@:
750     Generates a global-unique opaque string.
751     \
752     {NOTE:: A URI reference is generated by this code.
753     \
754     }
755     @AliasFor:
756     @@@:
757     ::ManakaiDOM:all
758     @@For:
759     !=ManakaiDOM:all
760     @PerlDef:
761     (
762     sprintf 'mid:%d.%d.%s.dom.manakai@suika.fam.cx#',
763     time, $$,
764     ['A'..'Z', 'a'..'z', '0'..'9']->[rand 62] .
765     ['A'..'Z', 'a'..'z', '0'..'9']->[rand 62] .
766     ['A'..'Z', 'a'..'z', '0'..'9']->[rand 62] .
767     ['A'..'Z', 'a'..'z', '0'..'9']->[rand 62] .
768     ['A'..'Z', 'a'..'z', '0'..'9']->[rand 62]
769     )
770     ##ManakaiDOM:generateUniqueID
771    
772     ## -- lang:dis vocabulary
773    
774     TreeElementType:
775     @QName:
776     dis:GetProp
777     @dataType:
778     dis:TypeQName
779     @rdfs:range:
780     rdf:Property
781     @Description:
782     @@lang:en
783     @@@:
784     Gets the non-nodal value of a <Class::ManakaiDOM:ManakaiDOMNodeReference>
785     property (actualy <Class::ManakaiDOM:ManakaiDOMNodeObject> property).
786    
787     TreeElementType:
788     @QName:
789     dis:SetProp
790     @dataType:
791     dis:TypeQName
792     @rdfs:range:
793     rdf:Property
794     @Description:
795     @@lang:en
796     @@@:
797     Sets the non-nodal value of a <Class::ManakaiDOM:ManakaiDOMNodeReference>
798     property (actualy <Class::ManakaiDOM:ManakaiDOMNodeObject> property).
799    
800     ## -- Syntax sugar
801    
802     ElementTypeBinding:
803     @Name: TreeElementType
804     @ElementType:
805     dis:ResourceDef
806     @ShadowContent:
807     @@rdf:type:
808     DISLang:TreeElementType
809     @@AliasFor:
810     @@@@:
811     ::ManakaiDOM:all
812     @@@For:
813     !=ManakaiDOM:all
814    
815     ElementTypeBinding:
816     @Name: ClassDef
817     @ElementType:
818     dis:ResourceDef
819     @ShadowContent:
820     @@rdf:type:
821     ManakaiDOM:Class
822     @@AliasFor:
823     @@@@:
824 wakaba 1.2 ::ManakaiDOM:Perl
825 wakaba 1.1 @@@For:
826 wakaba 1.2 !=ManakaiDOM:Perl
827     @@ForCheck:
828     ManakaiDOM:Perl
829 wakaba 1.1
830     ElementTypeBinding:
831     @Name: IntMethod
832     @ElementType:
833     dis:ResourceDef
834     @ShadowContent:
835     @@rdf:type:
836     DISLang:Method
837     @@ManakaiDOM:isForInternal:1
838    
839     ElementTypeBinding:
840     @Name: Return
841     @ElementType:
842     dis:ResourceDef
843     @ShadowContent:
844     @@rdf:type:
845     DISLang:MethodReturn
846    
847     ElementTypeBinding:
848     @Name: Param
849     @ElementType:
850     dis:ResourceDef
851     @ShadowContent:
852     @@rdf:type:
853     DISLang:MethodParameter
854    
855     ElementTypeBinding:
856     @Name: PerlDef
857     @ElementType:
858     dis:Def
859     @ShadowContent:
860     @@ContentType:
861     lang:Perl
862    
863     ElementTypeBinding:
864     @Name: InCase
865     @ElementType:
866     dis:ResourceDef
867     @ShadowContent:
868     @@rdf:type:
869     ManakaiDOM:InCase
870    
871     ## ManakaiNode.dis ends here

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24