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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.16 - (hide annotations) (download)
Fri Apr 29 06:07:06 2005 UTC (20 years, 2 months ago) by wakaba
Branch: MAIN
Changes since 1.15: +44 -40 lines
Variables implemented

1 wakaba 1.1 Module:
2     @QName:
3     Util:PerlCode
4     @FullName:
5     @@lang: en
6     @@@:
7     Perl Code Constructor
8     @Namespace:
9     http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/PerlCode#
10    
11     @Description:
12     @@lang:en
13     @@@:
14     This module provides an object-oriented interface to construct
15     Perl code.
16    
17     @Author:
18     @@FullName: Wakaba
19     @@Mail: w@suika.fam.cx
20     @License:
21     @@@:
22     license:Perl+MPL
23     @@Original:
24     @@@FullName:
25     manakai <CODE::lib/manakai/genlib.pl>
26     @@@Year:2004
27     @@@Author:
28     @@@@FullName:Wakaba
29     @@@@Mail:w@suika.fam.cx
30     @Date:
31     @@@:
32 wakaba 1.16 $Date: 2005/04/28 15:22:59 $
33 wakaba 1.1 @@ContentType:
34     dis:Date.RCS
35    
36     @Require:
37     @@Module:
38     @@@Name: ManakaiNode
39     @@@WithFor:
40     ManakaiDOM:Perl
41     @@Module:
42     @@@Name: DOMBoot
43 wakaba 1.5 @@@QName:
44     MDOM:DOMBoot
45 wakaba 1.1 @@@WithFor:
46     ManakaiDOM:ManakaiDOMLatest
47     @@Module:
48     @@@Name: DOMMetaImpl
49 wakaba 1.5 @@@QName:
50     MDOM:DOMMetaImpl
51 wakaba 1.1 @@@WithFor:
52     ManakaiDOM:ManakaiDOMLatest
53    
54     @DefaultFor:
55     ManakaiDOM:Perl
56    
57     Namespace:
58     @DIS:
59     http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/DIS#
60     @dis:
61     http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#dis--
62     @dis2pm:
63     http://suika.fam.cx/~wakaba/archive/2004/11/8/dis2pm#
64     @DISlib:
65     http://suika.fam.cx/~wakaba/archive/2004/dis/
66     @DOMCore:
67     http://suika.fam.cx/~wakaba/archive/2004/8/18/dom-core#
68     @DOMLS:
69     http://suika.fam.cx/~wakaba/archive/2004/dom/ls#
70     @DOMMain:
71     http://suika.fam.cx/~wakaba/archive/2004/dom/main#
72     @infoset:
73     http://www.w3.org/2001/04/infoset#
74     @lang:
75     http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#
76     @license:
77     http://suika.fam.cx/~wakaba/archive/2004/8/18/license#
78     @ManakaiDOM:
79     http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom#
80     @Markup:
81     http://suika.fam.cx/~wakaba/archive/2005/manakai/Markup#
82 wakaba 1.5 @MDOM:
83     http://suika.fam.cx/~wakaba/archive/2004/8/18/manakai-dom#ManakaiDOM.
84 wakaba 1.1 @MDOMX:
85     http://suika.fam.cx/~wakaba/archive/2004/8/4/manakai-dom-exception#
86     @owl:
87     http://www.w3.org/2002/07/owl#
88     @pc:
89     http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/PerlCode#
90     @Perl:
91     http://suika.fam.cx/~wakaba/archive/2004/8/18/lang#Perl--
92     @rdf:
93     http://www.w3.org/1999/02/22-rdf-syntax-ns#
94     @rdfs:
95     http://www.w3.org/2000/01/rdf-schema#
96     @swcfg21:
97     http://suika.fam.cx/~wakaba/archive/2005/swcfg21#
98     @TreeCore:\
99     @Util:
100     http://suika.fam.cx/~wakaba/archive/2005/manakai/Util/
101    
102     ## -- Features
103    
104     ElementTypeBinding:
105     @Name: FeatureDef
106     @ElementType:
107     dis:ResourceDef
108     @ShadowContent:
109     @@rdf:type:
110     DOMMain:DOMFeature
111     @@AliasFor:
112     @@@@:
113     ::ManakaiDOM:all
114     @@@For:
115     !=ManakaiDOM:all
116    
117     ElementTypeBinding:
118     @Name: FeatureVerDef
119     @ElementType:
120     dis:ResourceDef
121     @ShadowContent:
122     @@rdf:type:
123     DOMMain:DOMFeature
124    
125     ElementTypeBinding:
126     @Name: featureQName
127     @ElementType:
128     dis:AppName
129     @ShadowContent:
130     @@ContentType:
131     dis:TypeQName
132    
133     FeatureDef:
134     @QName: CoreFeature
135     @featureQName:
136     Util:PerlCode
137     @FeatureVerDef:
138     @@QName: CoreFeature10
139     @@Version: 1.0
140     @@ISA: CoreFeature
141     @@FullName:
142     @@@lang:en
143     @@@@:
144     Perl Code Constructor, version 1.0
145     @@Description:
146     @@@lang:en
147     @@@@:
148     Perl Code Constructor, version 1.0.
149    
150     ## -- Classes
151    
152     ClsDef:
153     @ClsQName: ManakaiPerlCodeFragment
154     @ClsISA:
155     ManakaiDOM:ManakaiDOMNodeReference::ManakaiDOM:Perl
156     @enDesc:
157     A class on which another Perl code classes are constructed based.
158    
159     @IntMethod:
160     @@Operator:
161     @@@@:
162     ManakaiDOM:MUErrorHandler
163     @@@ContentType:
164     dis:TypeQName
165     @@Description:
166     @@@lang:en
167     @@@@:
168     This method is a generic error handler; all manakai exceptions
169     and warnings associated to an object are once reported to this method
170     and then delivered to appropriate entities.
171     \
172     If the error is an exception (such as <X::DOMCore:DOMException> or
173     <X::ManakaiDOM:ManakaiDOMImplementationException>), it is
174     simply thrown. If the error is only a warning, it is reported
175     via the <IF::DOMCore:DOMError> interface.
176     \
177     See <PerlModule::Message::Util::Error> documentation for more
178     information on the error reporting mechanism.
179     \
180     {NOTE:: This kind of methods are named as <Perl::___report_error>
181     in the convention of <PerlModule::Message::Util::Error>.
182     \
183     }
184     @@Param:
185     @@@Name:err
186     @@@Type:
187     ManakaiDOM:ManakaiDOMExceptionOrWarning::ManakaiDOM:Perl
188     @@@Description:
189     @@@@lang:en
190     @@@@@:
191     An exception object that describes what kind of error it is
192     and how it should be recovered.
193     \
194     {NOTE:: Exception objects in manakai implementation
195     inherit the class <PerlModule::Message::Util::Error>,
196     that in turn inherits <PerlModule::Error>.
197     \
198     }
199     @@Return:
200     @@@PerlDef:
201     if ($err->isa (<ClassName::ManakaiDOM:ManakaiDOMException
202     ::ManakaiDOM:Perl>)) {
203     $err->throw;
204     } else {
205     \## TODO: Implement warning reporting
206     warn $err->stringify;
207     }
208    
209     @Attr:
210     @@Name: parentNode
211     @@enDesc:
212     The parent construction of this object.
213     @@Get:
214     @@@Type: ManakaiPerlCodeFragment
215 wakaba 1.5 @@@nullCase:
216     @@@@enDesc:
217     This object has no parent.
218 wakaba 1.1 @@@PerlDef:
219     $r = $self->{<Q::TreeCore:node>}->{<Q::pc:parent>};
220 wakaba 1.6 $r = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($r) if $r;
221    
222     @Attr:
223     @@Name: fileNode
224     @@enDesc:
225     The root <QUOTE::file> node of the tree to which this node belongs.
226     @@Type: ManakaiPerlCodeFragment
227     @@Get:
228     @@@enDesc:
229     The <QUOTE::file> node of the tree.
230     @@@nullCase:
231     @@@@enDesc:
232     This node does not belong to any file tree.
233     @@@PerlDef:
234     $r = $self->{<Q::TreeCore:node>}->{<Q::pc:parent>};
235     {
236     if ($r->{<Q::pc:parent>}) {
237     $r = $r->{<Q::pc:parent>};
238     redo;
239     }
240     };
241     if ($r) {
242     if ($r->{<Q::pc:nodeType>} eq 'file') {
243     __DEEP{
244     $r = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($r);
245     }__;
246     } else {
247     $r = null;
248     }
249     } elsif ($self->{<Q::TreeCore:node>}->{<Q::pc:nodeType>} eq 'file') {
250     $r = $self;
251     }
252    
253     @IntMethod:
254     @@Name: getNodeReference
255     @@ManakaiDOM:isStatic:1
256     @@enDesc:
257     Gets a node reference for a node object.
258     @@Param:
259     @@@Name: object
260     @@@Type:
261     ManakaiDOM:ManakaiDOMNodeReference::ManakaiDOM:Perl
262     @@@enDesc:
263     A node object.
264     @@Return:
265     @@@Type:
266     ManakaiDOM:ManakaiDOMNodeReference::ManakaiDOM:Perl
267     @@@PerlDef:
268     my $nt = $object->{<Q::pc:nodeType>};
269     my $pack;
270 wakaba 1.9 __CODE{pc:nodeTypeToPackageName::
271     $nodeType => $nt, $packageName => $pack, $object => $object}__;
272 wakaba 1.6 __CODE{ManakaiNode:getNewReference::
273     $object => $object, $ref => $r, $class => $pack}__;
274    
275     @Method:
276     @@Name: replaceVariable
277     @@enDesc:
278     Replaces a variable.
279     \
280     {NOTE:: For objects of type <Class::ManakaiPerlFile>,
281 wakaba 1.11 <Class::ManakaiPerlPackageScope>,
282     <Class::ManakaiPerlSub> and
283     <Class::ManakaiPerlVariable>, the result is undefined.
284 wakaba 1.6 \
285     }
286     @@Param:
287     @@@Name: originalVariable
288     @@@Type:
289     lang:Perl::ManakaiDOM:all
290     @@@enDesc:
291     Original variable specification, including prefix.
292     \
293     {NOTE:: Qualified name variable and hash key is not supported.
294     \
295     }
296     @@Param:
297     @@@Name: newValue
298 wakaba 1.11 @@@Type:
299     DOMMain:any::ManakaiDOM:all
300 wakaba 1.6 @@@enDesc:
301     New value to replace.
302 wakaba 1.11 @@@InCase:
303     @@@@Type:ManakaiPerlCodeFragment
304     @@@@enDesc:
305     New Perl code fragment to replace by.
306     @@@InCase:
307     @@@@Type:
308     lang:Perl::ManakaiDOM:all
309     @@@@enDesc:
310     Inline Perl code fragment string to replace by.
311 wakaba 1.6 @@Return:
312     @@@PerlDef:
313     my $node = $self->{<Q::TreeCore:node>};
314     if ($node->{<Q::pc:nodeType>} eq 'unparsed' or
315     $node->{<Q::pc:nodeType>} eq 'inunparsed') {
316 wakaba 1.11 my $newVariable = ref $newValue ? $newValue->stringify : ''.$newValue;
317 wakaba 1.14 $node->{<Q::pc:code>} =~ s/\Q$originalVariable\E\b/$newVariable/g;
318 wakaba 1.6 } elsif ($node->{<Q::pc:childNodes>}) {
319     __DEEP{
320 wakaba 1.11 for my $cnoi (0..$#{$node->{<Q::pc:childNodes>}}) {
321     my $cno = $node->{<Q::pc:childNodes>}->[$cnoi];
322     if ($cno->{<Q::pc:nodeType>} eq 'variable') {
323     if (substr ($originalVariable, 0, 1)
324     eq $cno->{<Q::pc:variableType>} and
325     not $cno->{<Q::pc:packageName>} and
326     substr ($originalVariable, 1)
327     eq $cno->{<Q::pc:localName>} and
328     not $cno->{<Q::pc:hashKey>}) {
329     if (ref $newValue) {
330     CORE::delete $cno->{<Q::pc:parent>};
331     $cno-><M::ManakaiDOM:ManakaiDOMNodeObject
332     ::ManakaiDOM:Perl.orphanate>;
333     my $newnode = $newValue->{<Q::TreeCore:node>};
334     $node-><M::ManakaiDOM:ManakaiDOMNodeObject
335     ::ManakaiDOM:Perl.importTree> ($newnode);
336     $newnode->{<Q::pc:parent>} = $node;
337     $node->{<Q::pc:childNodes>}->[$cnoi] = $newnode;
338     } else {
339     my $cn;
340     __CODE{ManakaiNode:getWeakReference::
341     $object => $cno, $ref => $cn,
342     $class => {<ClassName::ManakaiPerlCodeFragment>},
343     }__;
344     $cn-><M::ManakaiPerlInlineContainer.appendCode>
345     ($newValue);
346     }
347     }
348     } else { ## Non-variable child
349     my $cn;
350     __CODE{ManakaiNode:getWeakReference::
351     $object => $cno, $ref => $cn,
352     $class => {<ClassName::ManakaiPerlCodeFragment>},
353     }__;
354     $cn-><M::ManakaiPerlCodeFragment.replaceVariable>
355     ($originalVariable => $newValue);
356     }
357 wakaba 1.6 }
358     }__;
359     }
360 wakaba 1.13
361     @Method:
362     @@Name: addUsePerlModuleName
363     @@enDesc:
364     Adds a Perl module into the list of Perl modules
365     <Perl::use>d by this code fragment.
366     @@Param:
367     @@@Name: moduleName
368     @@@Type:
369     Perl:package-name::ManakaiDOM:all
370     @@@enDesc:
371     The name of the module package that should be <Perl::use>d.
372     @@Return:
373     @@@PerlDef:
374     $self->{<Q::TreeCore:node>}->{<Q::pc:useModuleName>}
375     ->{$moduleName} = true;
376    
377     @Method:
378 wakaba 1.15 @@Name: getUsePerlModuleNameList
379     @@enDesc:
380     Returns a list of Perl modules names that is <Perl::use>d
381     by this code fragment, including all descendant nodes.
382     @@Return:
383     @@@Type:
384     Perl:ARRAY::ManakaiDOM:all
385     @@@enDesc:
386     A list of module names. Note that the list is <EM::dead>;
387     any modification to it does not affect to the code fragment
388     and vice versa.
389     @@@PerlDef:
390     my $list = {};
391     my @node = ($self->{<Q::TreeCore:node>});
392     while (my $node = shift @node) {
393     next unless $node;
394     for my $mname (keys %{$node->{<Q::pc:useModuleName>} || {}}) {
395     $list->{$mname} ||= $node->{<Q::pc:useModuleName>}->{$mname};
396     }
397     push @node, $node->{$_} for @{$node->{<Q::TreeCore:subnode0>}};
398     my @n;
399     for my $nn (map {$node->{$_}} @{$node->{<Q::TreeCore:subnode2>}}) {
400     push @n, (ref $nn eq 'ARRAY' ? @$nn : values %{$nn || {}});
401     }
402     for my $n ((map {$node->{$_}} @{$node->{<Q::TreeCore:subnode>}}), @n) {
403     push @node, (ref $n eq 'ARRAY' ? @$n : values %{$n || {}});
404     }
405     }
406     $r = [grep {$list->{$_}} keys %$list];
407    
408     @Method:
409 wakaba 1.13 @@Name: disAddRequireURI
410     @@enDesc:
411     Adds a <QUOTE::dis> resource into the list of <Perl::require>d
412     resources of this code fragment.
413     @@Param:
414     @@@Name: uriArg
415     @@@Type:
416     DISLang:String::ManakaiDOM:all
417     @@@enDesc:
418     The URI reference of the resource to add.
419     @@Return:
420     @@@PerlDef:
421     $self->{<Q::TreeCore:node>}->{<Q::pc:requireResourceURI>}
422     ->{$uriArg} = true;
423 wakaba 1.15
424     @Method:
425     @@Name: disGetRequireURIList
426     @@enDesc:
427     Returns a list of <QUOTE::dis> resource URI references that is
428     <Perl::require>d by this code fragment, including all descendant nodes.
429     @@Return:
430     @@@Type:
431     Perl:ARRAY::ManakaiDOM:all
432     @@@enDesc:
433     A list of resource URI references. Note that the list is <EM::dead>;
434     any modification to it does not affect to the code fragment
435     and vice versa.
436     @@@PerlDef:
437     my $list = {};
438     my @node = ($self->{<Q::TreeCore:node>});
439     while (my $node = shift @node) {
440     next unless $node;
441     for my $mname (keys %{$node->{<Q::pc:requireResourceURI>} || {}}) {
442     $list->{$mname} ||= $node->{<Q::pc:requireResourceURI>}->{$mname};
443     }
444     push @node, $node->{$_} for @{$node->{<Q::TreeCore:subnode0>}};
445     my @n;
446     for my $nn (map {$node->{$_}} @{$node->{<Q::TreeCore:subnode2>}}) {
447     push @n, (ref $nn eq 'ARRAY' ? @$nn : values %{$nn || {}});
448     }
449     for my $n ((map {$node->{$_}} @{$node->{<Q::TreeCore:subnode>}}), @n) {
450     push @node, (ref $n eq 'ARRAY' ? @$n : values %{$n || {}});
451     }
452     }
453     $r = [grep {$list->{$_}} keys %$list];
454 wakaba 1.1 ##PerlCodeFragment
455    
456 wakaba 1.13 PropDef:
457     @QName: useModuleName
458     @enDesc:
459     The list of modules.
460    
461     PropDef:
462     @QName: requireResourceURI
463     @enDesc:
464     The list of resources.
465    
466 wakaba 1.9 ResourceDef:
467     @QName: nodeTypeToPackageName
468     @rdf:type:
469     dis2pm:BlockCode
470     @enDesc:
471     Gets Perl class package name from a node type string.
472     @PerlDef:
473     if ($nodeType eq 'unparsed') {
474     $packageName = <ClassName::ManakaiPerlUnparsedCode>;
475     } elsif ($nodeType eq 'bare') {
476     $packageName = <ClassName::ManakaiPerlBare>;
477     } elsif ($nodeType eq 'atom') {
478     $packageName = <ClassName::ManakaiPerlAtom>;
479     } elsif ($nodeType eq 'variable') {
480     $packageName = <ClassName::ManakaiPerlVariable>;
481     } elsif ($nodeType eq 'inunparsed') {
482     $packageName = <ClassName::ManakaiPerlInlineUnparsedCode>;
483     } elsif ($nodeType eq 'incontainer') {
484     $packageName = <ClassName::ManakaiPerlInlineContainer>;
485     } elsif ($nodeType eq 'statement') {
486     $packageName = <ClassName::ManakaiPerlStatement>;
487 wakaba 1.11 } elsif ($nodeType eq 'assign') {
488     $packageName = <ClassName::ManakaiPerlAssignment>;
489 wakaba 1.9 } elsif ($nodeType eq 'string') {
490     $packageName = <ClassName::ManakaiPerlStringLiteral>;
491     } elsif ($nodeType eq 'blockcontainer') {
492     $packageName = <ClassName::ManakaiPerlBlockContainer>;
493     } elsif ($nodeType eq 'block') {
494     $packageName = <ClassName::ManakaiPerlBlock>;
495 wakaba 1.12 } elsif ($nodeType eq 'if') {
496     $packageName = <ClassName::ManakaiPerlIf>;
497 wakaba 1.9 } elsif ($nodeType eq 'sub') {
498     $packageName = <ClassName::ManakaiPerlSub>;
499     } elsif ($nodeType eq 'package') {
500     $packageName = <ClassName::ManakaiPerlPackageScope>;
501     } elsif ($nodeType eq 'file') {
502     $packageName = <ClassName::ManakaiPerlFile>;
503     } else {
504     __ASSERT{DISPerl:invariant::
505     msg => {qq[Node type: "$nodeType" ].
506     qq[(ref: "@{[ref $object]}")]},
507     }__;
508     }
509    
510    
511 wakaba 1.6 PropDef:
512     @QName: nodeType
513     @enDesc:
514     Node type.
515    
516 wakaba 1.1 ClsDef:
517     @ClsQName: ManakaiPerlFile
518 wakaba 1.16 @ClsISA: ManakaiPerlStatementContainer
519 wakaba 1.1 @enDesc:
520     Perl source code files.
521    
522     @IntMethod:
523     @@Name:newObject
524     @@ManakaiDOM:isStatic:1
525     @@Description:
526     @@@lang:en
527     @@@@:
528     Creates a new instance object for <Class::ManakaiPerlFile>.
529     @@Return:
530     @@@Type:
531     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
532     @@@Description:
533     @@@@lang:en
534     @@@@@:
535     The newly created node object.
536     @@@PerlDef:
537     @@@@@:
538     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
539     ::ManakaiDOM:Perl.new>;
540     push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
541     $node->{<Q::pc:childNodes>} = [];
542     $node->{<Q::pc:sourceFile>} = '';
543     $node->{<Q::pc:sourceModule>} = '';
544     $node->{<Q::pc:sourceFor>} = '';
545     $node->{<Q::pc:currentPackage>} = 'main';
546     $node->{<Q::pc:currentChunk>} = 0;
547 wakaba 1.6 $node->{<Q::pc:nodeType>} = 'file';
548 wakaba 1.1 @@@@ImplNote:
549     @@@@@lang:en
550     @@@@@@:
551     Properties: <Q::pc:sourceFile>,
552     <Q::pc:sourceModule>, <Q::pc:sourceFor>, <Q::childNodes>,
553 wakaba 1.6 <Q::pc:currentPackage>, <Q::pc:currentChunk>,
554 wakaba 1.14 <Q::pc:nodeType>, <Q::pc:useModuleName>,
555 wakaba 1.15 <Q::pc:requireResourceURI>, <Q::pc:requireModuleName>.
556 wakaba 1.1
557     @Method:
558     @@Name: appendNewPackage
559     @@enDesc:
560     Appends a new package scope block.
561     @@Param:
562     @@@Name: packageName
563     @@@Type:
564     Perl:package-name::ManakaiDOM:all
565     @@@enDesc:
566     The fully-qualified name of the package to create.
567     @@Return:
568     @@@Type: ManakaiPerlPackageScope
569     @@@enDesc:
570     The newly created package scope object.
571     @@@PerlDef:
572     $r = <ClassM::ManakaiPerlPackageScope.newObject>;
573     $r->{<Q::pc:packageName>} = $packageName;
574     $self->{<Q::TreeCore:node>}
575     -><M::ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
576     .importTree> ($r);
577     push @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}}, $r;
578     $r->{<Q::pc:parent>} = $self->{<Q::TreeCore:node>};
579 wakaba 1.6 __CODE{ManakaiNode:getNewReference::
580     $object => $r, $ref => $r,
581     $class => {<ClassName::ManakaiPerlPackageScope>}}__;
582 wakaba 1.1
583     @Method:
584 wakaba 1.13 @@Name: appendPackage
585     @@enDesc:
586     Appends a Perl package scope object.
587     @@Param:
588     @@@Name: codeArg
589     @@@Type: ManakaiPerlPackageScope
590     @@@enDesc:
591     The package to append.
592     @@Return:
593     @@@RaiseException:
594     @@@@@:IN_USE_NODE_ERR
595     @@@@enDesc:
596     An attempt is made to set a subroutine that is
597     already used elsewhere.
598     @@@PerlDef:
599     my $packobj = $codeArg->{<Q::TreeCore:node>};
600     if ($packobj->{<Q::pc:parent>}) {
601     __EXCEPTION{IN_USE_NODE_ERR::
602     pc:childNode => {$codeArg},
603     MDOMX:param-name => 'codeArg',
604     }__;
605     }
606     $self->{<Q::TreeCore:node>}
607     -><M::ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
608     .importTree> ($packobj);
609     push @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}}, $packobj;
610     $packobj->{<Q::pc:parent>} = $self->{<Q::TreeCore:node>};
611    
612     @Method:
613 wakaba 1.1 @@Name: getFirstPackage
614     @@enDesc:
615     Gets the first package scope block of a name.
616     @@Param:
617     @@@Name: packageName
618     @@@@Type:
619     Perl:package-name::ManakaiDOM:all
620     @@@@enDesc:
621     The fully-qualified name of the package to get.
622     @@NamedParam:
623     @@@Name: makeNewPackage
624     @@@Type:
625 wakaba 1.12 DOMMain:boolean::ManakaiDOM:all
626 wakaba 1.1 @@@enDesc:
627     Whether a new package scope object should be created if
628     no package of <P::packageName> found.
629     @@@TrueCase:
630     @@@@enDesc:
631     Makes a new object if not found.
632     @@@FalseCase:
633     @@@@enDesc:
634     Don't make a new object.
635     @@Return:
636     @@@Type: ManakaiPerlPackageScope
637     @@@enDesc:
638     The first package scope object whose name is equal to
639     <P::packageName>.
640     @@@nullCase:
641     @@@@enDesc:
642     There is no <P::packageName> package object and
643     the <P::makeNewPackage> parameter is set to <DOM::false>.
644     @@@PerlDef:
645     for my $cn (@{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}}) {
646 wakaba 1.16 if ($cn->{<Q::pc:nodeType>} eq 'package' and
647     $cn->{<Q::pc:packageName>} eq $packageName) {
648 wakaba 1.1 $r = $cn;
649     last;
650     }
651     }
652     if ($r) {
653 wakaba 1.6 __CODE{ManakaiNode:getNewReference::
654     $object => $r, $ref => $r,
655     $class => {<ClassName::ManakaiPerlPackageScope>}}__;
656 wakaba 1.1 } elsif ($makeNewPackage) {
657     __DEEP{
658     $r = $self-><M::ManakaiPerlFile.appendNewPackage> ($packageName);
659     }__;
660     }
661    
662     @Method:
663     @@Name: getLastPackage
664     @@enDesc:
665     Gets the last package scope block of a name.
666     @@Param:
667     @@@Name: packageName
668     @@@@Type:
669     Perl:package-name::ManakaiDOM:all
670     @@@@enDesc:
671     The fully-qualified name of the package to get.
672     @@NamedParam:
673     @@@Name: makeNewPackage
674     @@@Type:
675 wakaba 1.12 DOMMain:boolean::ManakaiDOM:all
676 wakaba 1.1 @@@enDesc:
677     Whether a new package scope object should be created if
678     no package of <P::packageName> found.
679     @@@TrueCase:
680     @@@@enDesc:
681     Makes a new object if not found.
682     @@@FalseCase:
683     @@@@enDesc:
684     Don't make a new object.
685     @@Return:
686     @@@Type: ManakaiPerlPackageScope
687     @@@enDesc:
688     The last package scope object whose name is equal to
689     <P::packageName>.
690     @@@nullCase:
691     @@@@enDesc:
692     There is no <P::packageName> package object and
693     the <P::makeNewPackage> parameter is set to <DOM::false>.
694     @@@PerlDef:
695     for my $cn (reverse @{$self->{<Q::TreeCore:node>}
696     ->{<Q::pc:childNodes>}}) {
697 wakaba 1.16 if ($cn->{<Q::pc:nodeType>} eq 'package' and
698     $cn->{<Q::pc:packageName>} eq $packageName) {
699 wakaba 1.1 $r = $cn;
700     last;
701     }
702     }
703     if ($r) {
704 wakaba 1.6 __CODE{ManakaiNode:getNewReference::
705     $object => $r, $ref => $r,
706     $class => {<ClassName::ManakaiPerlPackageScope>}}__;
707 wakaba 1.1 } elsif ($makeNewPackage) {
708     __DEEP{
709     $r = $self-><M::ManakaiPerlFile.appendNewPackage> ($packageName);
710     }__;
711     }
712    
713     @Attr:
714     @@Name: sourceFile
715     @@enDesc:
716     The file name of the source file from which this
717     Perl code is primary generated.
718     @@Get:
719     @@@Type:
720 wakaba 1.12 DISLang:String::ManakaiDOM:all
721 wakaba 1.1 @@@disDef:
722     @@@@GetProp: sourceFile
723     @@Set:
724     @@@Type:
725 wakaba 1.12 DISLang:String::ManakaiDOM:all
726 wakaba 1.1 @@@disDef:
727     @@@@SetProp: sourceFile
728    
729     @Attr:
730     @@Name: sourceModule
731     @@enDesc:
732     The name URI reference of the source module that this package defines.
733     @@Get:
734     @@@Type:
735 wakaba 1.12 DISLang:String::ManakaiDOM:all
736 wakaba 1.1 @@@disDef:
737     @@@@GetProp: sourceModule
738     @@Set:
739     @@@Type:
740 wakaba 1.12 DISLang:String::ManakaiDOM:all
741 wakaba 1.1 @@@disDef:
742     @@@@SetProp: sourceModule
743    
744     @Attr:
745     @@Name: sourceFor
746     @@enDesc:
747     The URI reference of the source module <QUOTE::for> for which this
748     package is.
749     @@Get:
750     @@@Type:
751 wakaba 1.12 DISLang:String::ManakaiDOM:all
752 wakaba 1.1 @@@disDef:
753     @@@@GetProp: sourceFor
754     @@Set:
755     @@@Type:
756 wakaba 1.12 DISLang:String::ManakaiDOM:all
757 wakaba 1.1 @@@disDef:
758     @@@@SetProp: sourceFor
759    
760     @ToStringMethod:
761     @@Return:
762     @@@Type:
763 wakaba 1.12 DISLang:String::ManakaiDOM:all
764 wakaba 1.1 @@@enDesc:
765     The Perl code generated.
766     @@@PerlDef:
767     __DEEP{
768     my $node = $self->{<Q::TreeCore:node>};
769     ## -- Header
770     $r = qq<#!/usr/bin/perl \n>;
771     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
772     (q<This file is automatically generated>);
773     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
774     (q< at >.<ClassM::ManakaiPerlCodeImplementation
775     .rfc3339DateTime> (time).q<,>);
776     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
777     (q< from file ">.$node->{<Q::sourceFile>}.q<",>);
778     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
779     (q[ module <].$node->{<Q::sourceModule>}.q[>,]);
780     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
781     (q[ for <].$node->{<Q::sourceFor>}.q[>.]);
782     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
783     (q<Don't edit by hand!>);
784     $r .= qq<use strict;\n>;
785     $self-><AS::ManakaiPerlFile.currentPackage> ('main');
786 wakaba 1.6 $self-><AS::ManakaiPerlFile.currentChunkNumber> (0);
787 wakaba 1.1
788 wakaba 1.15 ## -- Requires
789     for my $pack (grep {$node->{<Q::pc:requireModuleName>}->{$_}}
790     keys %{$node->{<Q::pc:requireModuleName>} || {}}) {
791     $r .= qq<require $pack;\n>;
792     }
793    
794 wakaba 1.16 ## -- Packages and global objects
795 wakaba 1.1 my $pack = {};
796 wakaba 1.16 for my $cno (@{$node->{<Q::pc:childNodes>}}) {
797     my $cn = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($cno);
798     $r .= $cn->stringify;
799     if ($cno->{<Q::pc:nodeType>} eq 'package') {
800     for my $ipack (keys %{$cno->{<Q::dis:Implement>}}) {
801     $pack->{$ipack} ||= true; # not defined
802     }
803     $pack->{$cno->{<Q::pc:packageName>}} = []; # defined
804 wakaba 1.1 }
805     }
806    
807     ## -- Enables interface packages
808 wakaba 1.3 my @packs = map {'$' . $_ . '::'}
809     grep {not ref $pack->{$_} and $pack->{$_}}
810     keys %$pack;
811     $r .= q<for (>. join (', ', @packs) . qq<){}\n> if @packs;
812 wakaba 1.1
813     ## -- Footer
814     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
815 wakaba 1.2 (q[License: <].$node->{<Q::dis:License>}.qq[>\n]);
816 wakaba 1.1 $r .= qq<1;\n>;
817     }__;
818    
819     @Attr:
820     @@Name: currentPackage
821     @@enDesc:
822     The current Perl package (used in stringify method).
823     @@Type:
824     Perl:package-name::ManakaiDOM:all
825     @@Get:
826     @@@disDef:
827     @@@@GetProp: currentPackage
828     @@Set:
829     @@@disDef:
830     @@@@SetProp: currentPackage
831    
832     @Attr:
833 wakaba 1.6 @@Name: currentChunkNumber
834 wakaba 1.1 @@enDesc:
835 wakaba 1.6 The current code chunk number (used in stringify method).
836 wakaba 1.1 @@Type:
837     DOMMain:unsigned-long::ManakaiDOM:all
838     @@Get:
839     @@@disDef:
840     @@@@GetProp: currentChunk
841     @@Set:
842     @@@disDef:
843     @@@@SetProp: currentChunk
844 wakaba 1.6
845     @Method:
846     @@Name: getNextChunkNumber
847     @@enDesc:
848     Increments the current chunk number of this file
849     and returns it.
850     @@Return:
851     @@@Type:
852     DOMMain:unsigned-long::ManakaiDOM:all
853     @@@enDesc:
854     The next chunk number.
855     @@@PerlDef:
856     $r = ++$self->{<Q::TreeCore:node>}->{<Q::pc:currentChunk>};
857 wakaba 1.2
858     @Attr:
859     @@Name: licenseURI
860     @@enDesc:
861     The license term URI reference for this code.
862     @@Type:
863     DISLang:String::ManakaiDOM:all
864     @@Get:
865     @@@disDef:
866     @@@@GetProp:
867     dis:License
868     @@Set:
869     @@@disDef:
870     @@@@SetProp:
871     dis:License
872 wakaba 1.15
873     @Method:
874     @@Name: addRequirePerlModuleName
875     @@enDesc:
876     Adds a Perl module into the list of Perl modules
877     <Perl::require>d by this code fragment.
878     @@Param:
879     @@@Name: moduleName
880     @@@Type:
881     Perl:package-name::ManakaiDOM:all
882     @@@enDesc:
883     The name of the module package that should be <Perl::require>d.
884     @@Return:
885     @@@PerlDef:
886     $self->{<Q::TreeCore:node>}->{<Q::pc:requireModuleName>}
887     ->{$moduleName} = true;
888 wakaba 1.1 ##PerlFile
889    
890     PropDef:
891 wakaba 1.15 @QName: requireModuleName
892     @enDesc:
893     The list of <Perl::require>d Perl module names
894    
895     PropDef:
896 wakaba 1.1 @QName: sourceModule
897     @enDesc:
898     The soruce module name URI reference.
899    
900     PropDef:
901     @QName: sourceFor
902     @enDesc:
903     The source module <QUOTE::for> URI reference.
904    
905     PropDef:
906     @QName: currentPackage
907     @enDesc:
908     The current Perl package name (used for stringify).
909    
910     PropDef:
911     @QName: currentChunk
912     @enDesc:
913     The current code chunk (used for stringify).
914    
915     ClsDef:
916     @ClsQName: ManakaiPerlPackageScope
917 wakaba 1.16 @ClsISA: ManakaiPerlStatementContainer
918    
919     @enDesc:
920     A Perl lexical lines for which a <Perl::package> declaration
921     in effect.
922 wakaba 1.1
923     @Attr:
924     @@Name: packageName
925     @@Type:
926 wakaba 1.12 Perl:package-name::ManakaiDOM:all
927 wakaba 1.1 @@enDesc:
928     The fully-qualified package name.
929     @@Get:
930     @@@disDef:
931     @@@@GetProp: packageName
932    
933     @IntMethod:
934     @@Name:newObject
935     @@ManakaiDOM:isStatic:1
936     @@Description:
937     @@@lang:en
938     @@@@:
939     Creates a new instance object for <Class::ManakaiPerlPackageScope>.
940     @@Return:
941     @@@Type:
942     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
943     @@@Description:
944     @@@@lang:en
945     @@@@@:
946     The newly created node object.
947     @@@PerlDef:
948     @@@@@:
949     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
950     ::ManakaiDOM:Perl.new>;
951 wakaba 1.15 push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:sub>,
952 wakaba 1.16 <Q::dis2pm:operator>,
953     <Q::pc:childNodes>;
954 wakaba 1.1 push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
955     $node->{<Q::pc:sub>} = {};
956 wakaba 1.14 $node->{<Q::dis2pm:operator>} = {};
957 wakaba 1.1 $node->{<Q::dis:ISA>} = [];
958     $node->{<Q::dis:Implement>} = {};
959 wakaba 1.6 $node->{<Q::pc:nodeType>} = 'package';
960 wakaba 1.16 $node->{<Q::pc:childNodes>} = [];
961 wakaba 1.6 @@@@ImplNote:
962     @@@@@lang:en
963     @@@@@@:
964 wakaba 1.14 Properties: <Q::pc:sub>, <Q::dis2pm:operator>,
965 wakaba 1.6 <Q::dis:ISA>, <Q::dis:Implement>,
966 wakaba 1.14 <Q::pc:nodeType>, <Q::pc:useModuleName>,
967 wakaba 1.16 <Q::pc:requireResourceURI>, <Q::pc:childNodes>.
968 wakaba 1.1
969     @Method:
970     @@Name: getSub
971     @@enDesc:
972     Gets a subroutine.
973     @@Param:
974     @@@Name: subName
975     @@@Type:
976     DISPerl:SubName::ManakaiDOM:all
977     @@@enDesc:
978     The name of subroutine to get.
979     @@NamedParam:
980     @@@Name: makeNewNode
981     @@@Type:
982 wakaba 1.12 DOMMain:boolean::ManakaiDOM:all
983 wakaba 1.1 @@@enDesc:
984     Whether a new subroutine object should be created,
985     if it is not exist, or not.
986     @@Return:
987     @@@Type: ManakaiPerlSub
988     @@@enDesc:
989     The subroutine object.
990 wakaba 1.4 @@@nullCase:
991     @@@@enDesc:
992     Either the specified subroutine is not found and
993     the <P::makeNewNode> parameter is set to <DOM::false> or
994     the subroutine is defined as an alias.
995 wakaba 1.1 @@@PerlDef:
996     if ($self->{<Q::TreeCore:node>}->{<Q::pc:sub>}->{$subName}) {
997 wakaba 1.4 $r = ref $self->{<Q::TreeCore:node>}->{<Q::pc:sub>}->{$subName}
998     ? $self->{<Q::TreeCore:node>}->{<Q::pc:sub>}->{$subName} : null;
999 wakaba 1.1 } elsif ($makeNewNode) {
1000     $r = $self->{<Q::TreeCore:node>}->{<Q::pc:sub>}->{$subName}
1001     = <ClassM::ManakaiPerlSub.newObject>;
1002     $self->{<Q::TreeCore:node>}
1003     -><M::ManakaiDOM:ManakaiDOMNodeObject
1004     ::ManakaiDOM:Perl.importTree> ($r);
1005     $r->{<Q::pc:parent>} = $self->{<Q::TreeCore:node>};
1006     $r->{<Q::pc:localName>} = $subName;
1007     }
1008 wakaba 1.6 if ($r) {
1009     __CODE{ManakaiNode:getNewReference::
1010     $object => $r, $ref => $r,
1011     $class => {<ClassName::ManakaiPerlSub>}}__;
1012     }
1013 wakaba 1.1
1014 wakaba 1.4 @Method:
1015 wakaba 1.5 @@Name: setSub
1016     @@enDesc:
1017     Sets a subrotine.
1018     @@Param:
1019     @@@Name: subName
1020     @@@Type:
1021     DISLang:String::ManakaiDOM:all
1022     @@@enDesc:
1023     The name of the subroutine.
1024     \
1025     {NOTE:: The <P::subName> value must be equal to the
1026     <A::ManakaiPerlSub.localName> of the <P::subArg>.
1027     @@Param:
1028     @@@Name: subArg
1029     @@@Type: ManakaiPerlSub
1030     @@@enDesc:
1031     The subroutine object.
1032     @@Return:
1033     @@@RaiseException:
1034     @@@@@:IN_USE_NODE_ERR
1035     @@@@enDesc:
1036     An attempt is made to set a subroutine that is
1037     already used elsewhere.
1038     @@@PerlDef:
1039     my $ops = $self->{<Q::TreeCore:node>}->{<Q::pc:sub>};
1040     if (ref $ops->{$subName}) {
1041     CORE::delete $ops->{<Q::pc:parent>};
1042     $ops->{$subName}
1043     -><M::ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl.orphanate>;
1044     }
1045     if ($subArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
1046     __EXCEPTION{IN_USE_NODE_ERR::
1047     pc:childNode => {$subArg},
1048     }__;
1049     }
1050     $self->{<Q::TreeCore:node>}-><M::MNodeObject.importTree>
1051     ($subArg->{<Q::TreeCore:node>});
1052     $ops->{$subName} = $subArg->{<Q::TreeCore:node>};
1053     $subArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}
1054     = $self->{<Q::TreeCore:node>};
1055    
1056     @Method:
1057 wakaba 1.4 @@Name: getSubAliasName
1058     @@enDesc:
1059     Gets the real name of a subroutine.
1060     @@Param:
1061     @@@Name: subName
1062     @@@Type:
1063     DISLang:String::ManakaiDOM:all
1064     @@@enDesc:
1065     The name of the alias subroutine.
1066     @@Return:
1067     @@@Type:
1068     DISLang:String::ManakaiDOM:all
1069     @@@enDesc:
1070     The real name.
1071     @@@nullCase:
1072     @@@@enDesc:
1073     The specified name is used.
1074     @@@InCase:
1075     @@@@Value:\#CODE
1076     @@@@enDesc:
1077     The specified name is not an alias.
1078     @@@PerlDef:
1079     if ($self->{<Q::TreeCore:node>}->{<Q::sub>}->{$subName}) {
1080     $r = ref $self->{<Q::TreeCore:node>}
1081     ->{<Q::sub>}->{$subName}
1082     ? q<#CODE> : $self->{<Q::TreeCore:node>}
1083     ->{<Q::sub>}->{$subName};
1084     }
1085    
1086     @Method:
1087     @@Name: setSubAliasName
1088     @@enDesc:
1089     Sets a subroutine name as an alias of another subroutine.
1090     @@Param:
1091     @@@Name: aliasName
1092     @@@Type:
1093     DISLang:String::ManakaiDOM:all
1094     @@@enDesc:
1095     The alias name.
1096     @@Param:
1097     @@@Name: realName
1098     @@@Type:
1099     DISLang:String::ManakaiDOM:all
1100     @@@enDesc:
1101     The real name.
1102     @@Return:
1103     @@@UnknownOperatorException:
1104     @@@PerlDef:
1105     my $ops = $self->{<Q::TreeCore:node>}->{<Q::sub>};
1106     if (ref $ops->{$aliasName}) {
1107     CORE::delete $ops->{<Q::pc:parent>};
1108     $ops->{$aliasName}
1109     -><M::ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl.orphanate>;
1110     }
1111     $ops->{$aliasName} = $realName;
1112    
1113     @Method:
1114     @@Name: getOverloadSub
1115     @@enDesc:
1116     Gets an overloading subroutine.
1117     @@Param:
1118     @@@Name: opName
1119     @@@Type:
1120     DISLang:String::ManakaiDOM:all
1121     @@@enDesc:
1122     The name of the overloaded operator.
1123     @@NamedParam:
1124     @@@Name: makeNewNode
1125     @@@Type:
1126 wakaba 1.12 DOMMain:boolean::ManakaiDOM:all
1127 wakaba 1.4 @@@enDesc:
1128     Whether a new subroutine object should be created,
1129     if it is not exist, or not.
1130     @@Return:
1131     @@@Type: ManakaiPerlSub
1132     @@@enDesc:
1133     The subroutine object.
1134     @@@nullCase:
1135     @@@@enDesc:
1136     Either the specified subroutine is not found and
1137     the <P::makeNewNode> parameter is set to <DOM::false> or
1138     the specified operator is overloaded by specifying method name.
1139     @@@UnknownOperatorException:
1140     @@@PerlDef:
1141     unless (<Code::operatorNameList>->{$opName}) {
1142     __EXCEPTION{UNSUPPORTED_OPERATOR_ERR::
1143     pc:operator => {$opName},
1144     }__;
1145     }
1146     if ($self->{<Q::TreeCore:node>}->{<Q::dis2pm:operator>}->{$opName}) {
1147     $r = ref $self->{<Q::TreeCore:node>}
1148     ->{<Q::dis2pm:operator>}->{$opName}
1149     ? $self->{<Q::TreeCore:node>}
1150     ->{<Q::dis2pm:operator>}->{$opName} : null;
1151     } elsif ($makeNewNode) {
1152     $r = $self->{<Q::TreeCore:node>}->{<Q::dis2pm:operator>}->{$opName}
1153     = <ClassM::ManakaiPerlSub.newObject>;
1154     $self->{<Q::TreeCore:node>}
1155     -><M::ManakaiDOM:ManakaiDOMNodeObject
1156     ::ManakaiDOM:Perl.importTree> ($r);
1157     $r->{<Q::pc:parent>} = $self->{<Q::TreeCore:node>};
1158     }
1159 wakaba 1.6 if ($r) {
1160     __CODE{ManakaiNode:getNewReference::
1161     $object => $r, $ref => $r,
1162     $class => {<ClassName::ManakaiPerlSub>}}__;
1163     }
1164 wakaba 1.4
1165     @Method:
1166 wakaba 1.5 @@Name: setOverloadSub
1167     @@enDesc:
1168     Sets an overloading subrotine.
1169     @@Param:
1170     @@@Name: opName
1171     @@@Type:
1172     DISLang:String::ManakaiDOM:all
1173     @@@enDesc:
1174     The name of the opeartor to overload.
1175     @@Param:
1176     @@@Name: subArg
1177     @@@Type: ManakaiPerlSub
1178     @@@enDesc:
1179     The subroutine object.
1180     @@Return:
1181     @@@UnknownOperatorException:
1182     @@@RaiseException:
1183     @@@@@:IN_USE_NODE_ERR
1184     @@@@enDesc:
1185     An attempt is made to set a subroutine that is
1186     already used elsewhere.
1187     @@@PerlDef:
1188     unless (<Code::operatorNameList>->{$opName}) {
1189     __EXCEPTION{UNSUPPORTED_OPERATOR_ERR::
1190     pc:operator => {$opName},
1191     }__;
1192     }
1193     my $ops = $self->{<Q::TreeCore:node>}->{<Q::dis2pm:operator>};
1194     if (ref $ops->{$opName}) {
1195     CORE::delete $ops->{<Q::pc:parent>};
1196     $ops->{$opName}
1197     -><M::ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl.orphanate>;
1198     }
1199     if ($subArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
1200     __EXCEPTION{IN_USE_NODE_ERR::
1201     pc:parentNode => {$self},
1202     pc:childNode => {$subArg},
1203     }__;
1204     }
1205     $self->{<Q::TreeCore:node>}-><M::MNodeObject.importTree>
1206     ($subArg->{<Q::TreeCore:node>});
1207     $ops->{$opName} = $subArg->{<Q::TreeCore:node>};
1208     $subArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}
1209     = $self->{<Q::TreeCore:node>};
1210    
1211    
1212     @Method:
1213 wakaba 1.4 @@Name: getOverloadMethodName
1214     @@enDesc:
1215     Gets an overloading method name.
1216     @@Param:
1217     @@@Name: opName
1218     @@@Type:
1219     DISLang:String::ManakaiDOM:all
1220     @@@enDesc:
1221     The name of the overloaded operator.
1222     @@Return:
1223     @@@Type:
1224     DISLang:String::ManakaiDOM:all
1225     @@@enDesc:
1226     The method name.
1227     @@@nullCase:
1228     @@@@enDesc:
1229     The specified operator is not overloaded.
1230     @@@InCase:
1231     @@@@Value:\#CODE
1232     @@@@enDesc:
1233     The operator is overloaded by an anonymous subroutine.
1234     @@@PerlDef:
1235     if ($self->{<Q::TreeCore:node>}->{<Q::dis2pm:operator>}->{$opName}) {
1236     $r = ref $self->{<Q::TreeCore:node>}
1237     ->{<Q::dis2pm:operator>}->{$opName}
1238     ? q<#CODE> : $self->{<Q::TreeCore:node>}
1239     ->{<Q::dis2pm:operator>}->{$opName};
1240     }
1241    
1242     @Method:
1243     @@Name: setOverloadMethodName
1244     @@enDesc:
1245     Sets an overloading method name.
1246     @@Param:
1247     @@@Name: opName
1248     @@@Type:
1249     DISLang:String::ManakaiDOM:all
1250     @@@enDesc:
1251     The name of the overloaded operator.
1252     @@Param:
1253     @@@Name: methodName
1254     @@@Type:
1255     DISLang:String::ManakaiDOM:all
1256     @@@enDesc:
1257     The name of the method by which overloads an operator.
1258     \
1259     {NOTE:: The method may or may not belong to this package.
1260     \
1261     }
1262     @@Return:
1263     @@@UnknownOperatorException:
1264     @@@PerlDef:
1265     unless (<Code::operatorNameList>->{$opName}) {
1266     __EXCEPTION{UNSUPPORTED_OPERATOR_ERR::
1267     pc:operator => {$opName},
1268     }__;
1269     }
1270     my $ops = $self->{<Q::TreeCore:node>}->{<Q::dis2pm:operator>};
1271     if (ref $ops->{$opName}) {
1272     CORE::delete $ops->{<Q::pc:parent>};
1273     $ops->{$opName}
1274     -><M::ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl.orphanate>;
1275     }
1276     $ops->{$opName} = $methodName;
1277    
1278 wakaba 1.1 @Method:
1279 wakaba 1.13 @@Name: addISAPackage
1280 wakaba 1.1 @@enDesc:
1281     Adds a class package that this class inherits.
1282     @@Param:
1283     @@@Name: packageName
1284     @@@Type:
1285     Perl:package-name::ManakaiDOM:all
1286     @@@enDesc:
1287     The name of package to add.
1288     @@Return:
1289     @@@PerlDef:
1290     push @{$self->{<Q::TreeCore:node>}->{<Q::dis:ISA>}}, $packageName;
1291    
1292     @Method:
1293     @@Name: addImplementPackage
1294     @@enDesc:
1295     Adds a interface package that this class implements.
1296     @@Param:
1297     @@@Name: packageName
1298     @@@Type:
1299     Perl:package-name::ManakaiDOM:all
1300     @@@enDesc:
1301     The name of package to add.
1302     @@Return:
1303     @@@PerlDef:
1304     $self->{<Q::TreeCore:node>}->{<Q::dis:Implement>}->{$packageName} = true;
1305    
1306     @ToStringMethod:
1307     @@Return:
1308     @@@Type:
1309 wakaba 1.12 DISLang:String::ManakaiDOM:all
1310 wakaba 1.1 @@@enDesc:
1311     Perl code.
1312     @@@PerlDef:
1313     my $file = $self-><AG::ManakaiPerlCodeFragment.parentNode>;
1314     my $node = $self->{<Q::TreeCore:node>};
1315 wakaba 1.15
1316     ## Package name
1317 wakaba 1.1 my $pn = $node->{<Q::pc:packageName>};
1318     $r .= q<package > . $pn . ";\n";
1319 wakaba 1.15
1320     ## Package version
1321 wakaba 1.1 __DEEP{
1322     $file-><AS::ManakaiPerlFile.currentPackage> ($pn);
1323     $r .= 'our $VERSION = '.
1324     <ClassM::ManakaiPerlCodeImplementation.versionDateTime> (time).
1325     ";\n";
1326     }__;
1327 wakaba 1.15
1328     ## Inheritance
1329 wakaba 1.1 my @isa = (@{$node->{<Q::dis:ISA>}},
1330     sort keys %{$node->{<Q::dis:Implement>}});
1331     if (@isa) {
1332     $r .= 'push our @ISA, ' .
1333     <ClassM::ManakaiPerlCodeImplementation.perlList> (\@isa) .
1334     ";\n";
1335     }
1336 wakaba 1.15
1337     ## Uses
1338     my $use = $self-><M::ManakaiPerlCodeFragment.getUsePerlModuleNameList>;
1339     for my $pack (@$use) {
1340     $r .= 'use ' . $pack . ";\n";
1341     }
1342    
1343 wakaba 1.16 ## Package-scope objects
1344     for my $cno (@{$node->{<Q::pc:childNodes>}}) {
1345     my $cn = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($cno);
1346     $r .= $cn->stringify;
1347     }
1348    
1349 wakaba 1.15 ## Subroutines
1350 wakaba 1.4 for my $cnk (keys %{$node->{<Q::pc:sub>}}) {
1351     my $cno = $node->{<Q::pc:sub>}->{$cnk};
1352     if (ref $cno) {
1353 wakaba 1.6 my $cn;
1354     __CODE{ManakaiNode:getWeakReference::
1355     $object => $cno, $ref => $cn,
1356     $class => {<ClassName::ManakaiPerlSub>}}__;
1357 wakaba 1.4 $r .= $cn->stringify;
1358     } else {
1359     $r .= qq<*$cnk = \&$cno;\n>;
1360     }
1361     }
1362 wakaba 1.15
1363     ## Operators
1364 wakaba 1.4 my $op = '';
1365     for my $cnk (keys %{$node->{<Q::dis2pm:operator>}}) {
1366     my $cno = $node->{<Q::dis2pm:operator>}->{$cnk};
1367     if (ref $cno) {
1368 wakaba 1.6 my $cn;
1369     __CODE{ManakaiNode:getWeakReference::
1370     $object => $cno, $ref => $cn,
1371     $class => {<ClassName::ManakaiPerlSub>}}__;
1372 wakaba 1.4 $op .= <ClassM::ManakaiPerlCodeImplementation.perlLiteral> ($cnk)
1373     . ' => ' . $cn->stringify . ', ';
1374     } elsif (defined $cno) {
1375     $op .= <ClassM::ManakaiPerlCodeImplementation.perlList>
1376     ([$cnk => $cno]) . ', ';
1377     }
1378     }
1379 wakaba 1.14 $r .= 'use overload bool => sub () {1}, ' .
1380     $op . qq[fallback => 1;\n] if $op;
1381 wakaba 1.1 ##PerlPackageScope
1382    
1383 wakaba 1.4 PropDef:
1384     @QName:
1385     dis2pm:operator
1386     @enDesc:
1387     Overloaded operators.
1388    
1389     ElementTypeBinding:
1390     @Name: UnknownOperatorException
1391     @ElementType:
1392     ManakaiDOM:raises
1393     @ShadowContent:
1394     @@@:UNSUPPORTED_OPERATOR_ERR
1395     @@enDesc:
1396     An attempt is made to overload an unknown operator.
1397    
1398     XParamDef:
1399     @QName:
1400     pc:operator
1401     @enDesc:
1402     An operator to overload.
1403    
1404     ResourceDef:
1405     @QName: operatorNameList
1406     @enDesc:
1407     The list of valid operators for <PerlModule::operator> pragma.
1408     @rdf:type:
1409     dis2pm:InlineCode
1410     @PerlDef:
1411     {qw[
1412     + 1 - 1 * 1 / 1 % 1 ** 1 << 1 >> 1 x 1 . 1
1413     += 1 -= 1 *= 1 /= 1 %= 1 **= 1 <<= 1 >>= 1 x= 1 .= 1
1414     < 1 <= 1 > 1 >= 1 == 1 != 1 <=> 1
1415     lt 1 le 1 gt 1 ge 1 eq 1 ne 1 cmp 1
1416     & 1 | 1 ^ 1 neg 1 ! 1 ~ 1
1417     ++ 1 -- 1 = 1
1418     atan2 1 cos 1 sin 1 exp 1 abs 1 log 1 sqrt 1
1419     bool 1 "" 1 0+ 1 ${} 1 @{} 1 %{} 1 &{} 1 *{} 1 <> 1
1420     nomethod 1
1421     ]}
1422    
1423 wakaba 1.1 ClsDef:
1424 wakaba 1.6 @ClsQName: ManakaiPerlStatementContainer
1425     @ClsISA: ManakaiPerlAnyContainer
1426 wakaba 1.1 @enDesc:
1427 wakaba 1.6 A base class for node types that contains zero or more
1428     statements and/or blocks.
1429 wakaba 1.1
1430     @Attr:
1431 wakaba 1.10 @@Name: sourceFile
1432     @@enDesc:
1433     The source file name of this fragment.
1434     @@Type:
1435 wakaba 1.12 DISLang:String::ManakaiDOM:all
1436 wakaba 1.10 @@Get:
1437     @@@enDesc:
1438     Any string identifying the source.
1439     @@@nullCase:
1440     @@@@enDesc: No source file name is set.
1441     @@@disDef:
1442     @@@@GetProp: sourceFile
1443     @@Set:
1444     @@@nullCase:
1445     @@@@enDesc: No (or unknown) source file.
1446     @@@disDef:
1447     @@@@SetProp: sourceFile
1448    
1449     @Attr:
1450     @@Name: sourceLine
1451     @@enDesc:
1452     Source file line number of the first line of this fragment.
1453     @@Type:
1454 wakaba 1.12 DOMMain:unsigned-long::ManakaiDOM:all
1455 wakaba 1.10 @@Get:
1456     @@@disDef:
1457     @@@@GetProp: sourceLine
1458     @@Set:
1459     @@@disDef:
1460     @@@@SetProp: sourceLine
1461    
1462     @Attr:
1463 wakaba 1.1 @@Name: currentSourceFile
1464     @@enDesc:
1465     The current source file name that is referred when
1466     a code fragment is added.
1467     @@Type:
1468 wakaba 1.12 DISLang:String::ManakaiDOM:all
1469 wakaba 1.1 @@Get:
1470     @@@nullCase:
1471     @@@@enDesc: No source file name is set.
1472     @@@disDef:
1473 wakaba 1.10 @@@@GetProp:currentSourceFile
1474 wakaba 1.1 @@Set:
1475     @@@nullCase:
1476     @@@@enDesc: No (or unknown) source file.
1477     @@@disDef:
1478 wakaba 1.10 @@@@SetProp:currentSourceFile
1479 wakaba 1.1
1480     @Attr:
1481     @@Name: currentSourceLine
1482     @@enDesc:
1483     The current line number in source file that is referred when
1484     a code fragment is added.
1485     @@Type:
1486 wakaba 1.6 DOMMain:unsigned-long::ManakaiDOM:all
1487 wakaba 1.1 @@Get:
1488     @@@disDef:
1489 wakaba 1.10 @@@@GetProp:currentSourceLine
1490 wakaba 1.1 @@Set:
1491     @@@disDef:
1492 wakaba 1.10 @@@@SetProp:currentSourceLine
1493 wakaba 1.1
1494     @Method:
1495 wakaba 1.5 @@Name: appendCodeFragment
1496     @@enDesc:
1497     Appends a <Class::ManakaiPerlCodeFragment> object.
1498     @@Param:
1499     @@@Name: codeArg
1500     @@@Type: ManakaiPerlCodeFragment
1501     @@@enDesc:
1502     A code fragment object.
1503     @@Return:
1504     @@@RaiseException:
1505     @@@@@:BAD_CHILD_ERR
1506     @@@@enDesc:
1507     An attempt is made to append a child
1508     that is not a <Class::ManakaiPerlUnparsedCode>.
1509     @@@RaiseException:
1510     @@@@@:IN_USE_NODE_ERR
1511     @@@@enDesc:
1512     An attempt is made to append a node that is
1513     already used elsewhere.
1514     @@@PerlDef:
1515 wakaba 1.6 if ({
1516     unparsed => 1, if => 1, statement => 1, block => 1,
1517 wakaba 1.9 blockcontainer => true,
1518 wakaba 1.6 inunparsed => 1, variable => 1, bare => 1, atom => 1,
1519     incontainer => 1, string => 1, assign => 1,
1520     }->{$codeArg->{<Q::TreeCore:node>}->{<Q::pc:nodeType>}}) {
1521 wakaba 1.5 if ($codeArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
1522     __EXCEPTION{IN_USE_NODE_ERR::
1523     pc:childNode => {$codeArg},
1524     }__;
1525     }
1526     $self->{<Q::TreeCore:node>}-><M::MNodeObject.importTree>
1527     ($codeArg->{<Q::TreeCore:node>});
1528     push @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}},
1529     $codeArg->{<Q::TreeCore:node>};
1530     $codeArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}
1531     = $self->{<Q::TreeCore:node>};
1532     } else {
1533     __EXCEPTION{BAD_CHILD_ERR::
1534     pc:parentNode => {$self},
1535     pc:childNode => {$codeArg},
1536     }__;
1537     }
1538    
1539     @Method:
1540 wakaba 1.1 @@Name: appendCode
1541     @@enDesc:
1542     Appends an unparsed Perl code fragment.
1543     @@Param:
1544     @@@Name: codeArg
1545     @@@Type:
1546     lang:Perl::ManakaiDOM:all
1547     @@@enDesc:
1548     An unparsed Perl code fragment.
1549     @@Return:
1550     @@@Type: ManakaiPerlUnparsedCode
1551     @@@enDesc:
1552     The newly created Perl code object.
1553     @@@PerlDef:
1554     $r = <ClassM::ManakaiPerlUnparsedCode.newObject>;
1555     my $node = $self->{<Q::TreeCore:node>};
1556 wakaba 1.10 $r->{<Q::sourceFile>} = $node->{<Q::pc:currentSourceFile>};
1557     $r->{<Q::sourceLine>} = $node->{<Q::pc:currentSourceLine>};
1558 wakaba 1.1 $r->{<Q::code>} = $codeArg;
1559 wakaba 1.10 $node->{<Q::pc:currentSourceLine>} += ($codeArg =~ tr/\x0A/\x0A/);
1560 wakaba 1.6 $node-><M::ManakaiDOM:ManakaiDOMNodeObject
1561     ::ManakaiDOM:Perl.importTree> ($r);
1562     push @{$node->{<Q::pc:childNodes>}}, $r;
1563     $r->{<Q::pc:parent>} = $node;
1564     __CODE{ManakaiNode:getNewReference::
1565     $object => $r, $ref => $r,
1566     $class =>{<ClassName::ManakaiPerlUnparsedCode>},
1567     }__;
1568 wakaba 1.1
1569     @Method:
1570     @@Name: skipLines
1571     @@enDesc:
1572     Skips lines in a code.
1573     @@Param:
1574     @@@Name: codeArg
1575     @@@Type:
1576     lang:Perl::ManakaiDOM:all
1577     @@@enDesc:
1578     A code fragment, which is counted lines.
1579     @@Return:
1580     @@@PerlDef:
1581 wakaba 1.10 $self->{<Q::TreeCore:node>}->{<Q::pc:currentSourceLine>}
1582 wakaba 1.1 += ($codeArg =~ tr/\x0A/\x0A/);
1583 wakaba 1.4
1584 wakaba 1.6 @ImplNote:
1585     @@lang:en
1586     @@@:
1587     A <Class::ManakaiPerlStatementContainer> object must have
1588     a property:
1589     <Q::pc:childNodes>.
1590 wakaba 1.8
1591     @Attr:
1592     @@Name: label
1593     @@enDesc:
1594     Label for this block.
1595     @@Type:
1596     DISLang:String::ManakaiDOM:all
1597     @@Get:
1598     @@@nullCase:
1599     @@@@enDesc:
1600     No label.
1601     @@@disDef:
1602     @@@@GetProp:label
1603     @@Set:
1604     @@@nullCase:
1605     @@@@enDesc:
1606     No label.
1607     @@@disDef:
1608     @@@@SetProp:label
1609    
1610     @Method:
1611     @@Name: appendBlock
1612     @@enDesc:
1613     Appends a Perl block code.
1614     @@Return:
1615     @@@Type: ManakaiPerlBlock
1616     @@@enDesc:
1617     The newly created Perl code object.
1618     @@@PerlDef:
1619     $r = <ClassM::ManakaiPerlBlock.newObject>;
1620     my $node = $self->{<Q::TreeCore:node>};
1621     $node-><M::ManakaiDOM:ManakaiDOMNodeObject
1622     ::ManakaiDOM:Perl.importTree> ($r);
1623     push @{$node->{<Q::pc:childNodes>}}, $r;
1624     $r->{<Q::pc:parent>} = $node;
1625     if (defined wantarray) {
1626     __CODE{ManakaiNode:getNewReference::
1627     $object => $r, $ref => $r,
1628     $class =>{<ClassName::ManakaiPerlBlock>},
1629     }__;
1630     }
1631    
1632     @Method:
1633     @@Name: appendStatement
1634     @@enDesc:
1635     Appends a Perl statement.
1636     @@Param:
1637     @@@Name: codeArg
1638     @@@Type:
1639     lang:Perl::ManakaiDOM:all
1640     @@@enDesc:
1641     A Perl statement without terminating <Perl::;>.
1642     @@@nullCase:
1643     @@@@enDesc:
1644     No initial content.
1645     @@Return:
1646     @@@Type: ManakaiPerlStatement
1647     @@@enDesc:
1648     The newly created Perl code object.
1649     @@@PerlDef:
1650     $r = <ClassM::ManakaiPerlStatement.newObject>;
1651     my $node = $self->{<Q::TreeCore:node>};
1652     $node-><M::ManakaiDOM:ManakaiDOMNodeObject
1653     ::ManakaiDOM:Perl.importTree> ($r);
1654     push @{$node->{<Q::pc:childNodes>}}, $r;
1655     $r->{<Q::pc:parent>} = $node;
1656     if (defined wantarray or defined $codeArg) {
1657     __CODE{ManakaiNode:getNewReference::
1658     $object => $r, $ref => $r,
1659     $class =>{<ClassName::ManakaiPerlStatement>},
1660     }__;
1661     if (defined $codeArg) {
1662     __DEEP{
1663     $r-><M::ManakaiPerlAnyContainer.appendBare> ($codeArg);
1664     }__;
1665     }
1666     }
1667 wakaba 1.12
1668     @Method:
1669     @@Name: appendNewIf
1670     @@enDesc:
1671     Appends a newly created <Class::ManakaiPerlIf> object.
1672     @@Param:
1673     @@@Name: conditionArg
1674     @@@Type: ManakaiPerlCodeFragment
1675     @@@enDesc:
1676     Conditoon code fragment object.
1677     @@Param:
1678     @@@Name: trueArg
1679     @@@Type: ManakaiPerlCodeFragment
1680     @@@enDesc:
1681     A true code fragment object.
1682     @@@nullCase:
1683     @@@@enDesc: No true code.
1684     @@Param:
1685     @@@Name: falseArg
1686     @@@Type: ManakaiPerlCodeFragment
1687     @@@enDesc:
1688     A false code fragment object.
1689     @@@nullCase:
1690     @@@@enDesc: No false code.
1691     @@Return:
1692     @@@RaiseException:
1693     @@@@@:BAD_CHILD_ERR
1694     @@@@enDesc:
1695     An attempt is made to append a child
1696     that is not valid type.
1697     @@@RaiseException:
1698     @@@@@:IN_USE_NODE_ERR
1699     @@@@enDesc:
1700     An attempt is made to append a node that is
1701     already used elsewhere.
1702     @@@PerlDef:
1703     for my $arg ([conditionArg => $conditionArg]) {
1704     if ({
1705     atom => 1, bare => 1, incontainer => 1, assign => true,
1706     inunparsed => 1, variable => 1, string => true,
1707     }->{$arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:nodeType>}}) {
1708     if ($arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
1709     __EXCEPTION{IN_USE_NODE_ERR::
1710     pc:childNode => {$arg->[1]},
1711     MDOMX:param-name => {$arg->[0]},
1712     }__;
1713     }
1714     } else {
1715     __EXCEPTION{BAD_CHILD_ERR::
1716     pc:parentNode => {$self},
1717     pc:childNode => {$arg->[1]},
1718     MDOMX:param-name => {$arg->[0]},
1719     }__;
1720     }
1721     } # c
1722    
1723     for my $arg ([trueArg => $trueArg],
1724     [falseArg => $falseArg]) {
1725     next unless $arg->[1];
1726     if ({
1727     blockcontainer => true,
1728     }->{$arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:nodeType>}}) {
1729     if ($arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
1730     __EXCEPTION{IN_USE_NODE_ERR::
1731     pc:childNode => {$arg->[1]},
1732     MDOMX:param-name => {$arg->[0]},
1733     }__;
1734     }
1735     } else {
1736     __EXCEPTION{BAD_CHILD_ERR::
1737     pc:parentNode => {$self},
1738     pc:childNode => {$arg->[1]},
1739     MDOMX:param-name => {$arg->[0]},
1740     }__;
1741     }
1742     } # t/f
1743    
1744     my $assign = <ClassM::ManakaiPerlIf.newObject>;
1745     $assign->{<Q::pc:condition>} = $conditionArg->{<Q::TreeCore:node>};
1746     $assign->{<Q::pc:true>} = $trueArg->{<Q::TreeCore:node>} if $trueArg;
1747     $assign->{<Q::pc:false>} = $falseArg->{<Q::TreeCore:node>} if $falseArg;
1748     $conditionArg->{<Q::TreeCore:node>}->{<Q::pc:parent>} = $assign;
1749     $trueArg->{<Q::TreeCore:node>}->{<Q::pc:parent>} = $assign if $trueArg;
1750     $falseArg->{<Q::TreeCore:node>}->{<Q::pc:parent>} = $assign if $falseArg;
1751     $self->{<Q::TreeCore:node>}-><M::MNodeObject.importTree> ($assign);
1752     $assign->{<Q::pc:parent>} = $self->{<Q::TreeCore:node>};
1753     push @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}}, $assign;
1754 wakaba 1.6 ##PerlStatementContainer
1755    
1756     ClsDef:
1757     @ClsQName: ManakaiPerlSub
1758     @ClsISA: ManakaiPerlStatementContainer
1759     @enDesc:
1760     Perl subroutines.
1761    
1762     @IntMethod:
1763     @@Name:newObject
1764     @@ManakaiDOM:isStatic:1
1765     @@Description:
1766     @@@lang:en
1767     @@@@:
1768     Creates a new instance object for <Class::ManakaiPerlSub>.
1769     @@Return:
1770     @@@Type:
1771     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
1772     @@@Description:
1773     @@@@lang:en
1774     @@@@@:
1775     The newly created node object.
1776     @@@PerlDef:
1777     @@@@@:
1778     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
1779     ::ManakaiDOM:Perl.new>;
1780     push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
1781     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
1782     $node->{<Q::pc:childNodes>} = [];
1783     $node->{<Q::pc:sourceLine>} = 0;
1784     $node->{<Q::pc:nodeType>} = 'sub';
1785     @@@@ImplNote:
1786     @@@@@lang:en
1787     @@@@@@:
1788     Optional properties: <Q::pc:localName>,
1789     <Q::pc:sourceFile>, <Q::pc:sourceLine>,
1790 wakaba 1.14 <Q::pc:nodeType>, <Q::pc:useModuleName>,
1791     <Q::pc:requireResourceURI>.
1792 wakaba 1.6
1793     @Attr:
1794     @@Name: localName
1795     @@enDesc:
1796     The name of this subroutine.
1797     @@Type:
1798 wakaba 1.12 DISPerl:SubName::ManakaiDOM:all
1799 wakaba 1.6 @@Get:
1800     @@@nullCase:
1801     @@@@enDesc:
1802     This subroutine has no name.
1803     @@@disDef:
1804     @@@@GetProp: localName
1805     @@Set:
1806     @@@enDesc:
1807     Sets the name of this subroutine.
1808     \
1809     {NOTE:: Setting this attribute does not change the
1810     name by which the subroutine is registerred to
1811     the parent object.
1812     \
1813     }
1814     @@@nullCase:
1815     @@@@enDesc:
1816     This subroutine has no name.
1817     @@@disDef:
1818     @@@@SetProp: localName
1819    
1820     @Attr:
1821     @@Name: prototype
1822     @@enDesc:
1823     The prototype of this subroutine.
1824     @@Type:
1825 wakaba 1.11 DISPerl:SubPrototype::ManakaiDOM:all
1826 wakaba 1.6 @@Get:
1827     @@@disDef:
1828     @@@@GetProp: prototype
1829     @@@nullCase:
1830     @@@@enDesc:
1831     No prototype is set.
1832     @@Set:
1833     @@@disDef:
1834     @@@@SetProp: prototype
1835     @@@nullCase:
1836     @@@@enDesc:
1837     No prototype declaration.
1838    
1839 wakaba 1.4 @ToStringMethod:
1840     @@Return:
1841     @@@Type:
1842 wakaba 1.11 DISLang:String::ManakaiDOM:all
1843 wakaba 1.4 @@@enDesc:
1844     Perl code.
1845     @@@PerlDef:
1846     my $node = $self->{<Q::TreeCore:node>};
1847     $r = q<sub>;
1848     $r .= ' ' . $node->{<Q::pc:localName>}
1849     if defined $node->{<Q::pc:localName>};
1850     $r .= ' (' . $node->{<Q::pc:prototype>} . ')'
1851     if defined $node->{<Q::pc:prototype>};
1852     $r .= " {\n";
1853 wakaba 1.6 for my $cno (@{$node->{<Q::pc:childNodes>}}) {
1854 wakaba 1.7 my $cn = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($cno);
1855 wakaba 1.6 $r .= $cn->stringify;
1856     }
1857 wakaba 1.4 $r .= "}\n";
1858 wakaba 1.14
1859     @NumValMethod:
1860     @@Return:
1861     @@@Type:
1862     DISIDL:AnyRealNumber::ManakaiDOM:all
1863     @@@PerlDef:
1864     my $cno = $self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}->[-1];
1865     if ($cno) {
1866     my $cn = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($cno);
1867     $r = 0 + $cn;
1868     }
1869    
1870 wakaba 1.1 ##PerlSub
1871    
1872 wakaba 1.5 XParamDef:
1873     @QName: parentNode
1874     @enDesc:
1875     Parent node.
1876    
1877     XParamDef:
1878     @QName: childNode
1879     @enDesc:
1880     Child node.
1881    
1882 wakaba 1.1 ClsDef:
1883     @ClsQName: ManakaiPerlUnparsedCode
1884     @ClsISA: ManakaiPerlCodeFragment
1885     @enDesc:
1886     Unparsed Perl code fragments.
1887    
1888     @IntMethod:
1889     @@Name:newObject
1890     @@ManakaiDOM:isStatic:1
1891     @@Description:
1892     @@@lang:en
1893     @@@@:
1894     Creates a new instance object for <Class::ManakaiPerlUnparsedCode>.
1895     @@Return:
1896     @@@Type:
1897     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
1898     @@@Description:
1899     @@@@lang:en
1900     @@@@@:
1901     The newly created node object.
1902     @@@PerlDef:
1903     @@@@@:
1904     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
1905     ::ManakaiDOM:Perl.new>;
1906     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
1907     $node->{<Q::pc:code>} = '';
1908 wakaba 1.6 $node->{<Q::pc:nodeType>} = 'unparsed';
1909 wakaba 1.1 @@@@ImplNote:
1910     @@@@@lang:en
1911     @@@@@@:
1912 wakaba 1.9 Properties: <Q::pc:nodeType>, <Q::pc:code>,
1913 wakaba 1.14 <Q::pc:sourceFile>, <Q::pc:sourceLine>,
1914     <Q::pc:useModuleName>,
1915     <Q::pc:requireResourceURI>.
1916 wakaba 1.9
1917     @IntCloneMethod:
1918     @@Return:
1919     @@@Type:
1920     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
1921     @@@PerlDef:
1922     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
1923     ::ManakaiDOM:Perl.new>;
1924     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
1925     for my $prop (<Q::pc:sourceFile>, <Q::pc:sourceLine>, <Q::pc:code>) {
1926     $node->{$prop} = $nodeObject->{$prop};
1927     }
1928     $node->{<Q::pc:nodeType>} = 'unparsed';
1929 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
1930     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
1931     $node->{<Q::pc:useModuleName>}
1932     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
1933 wakaba 1.5
1934     @Attr:
1935     @@Name: code
1936     @@enDesc:
1937     Perl code.
1938     @@Type:
1939     lang:Perl::ManakaiDOM:all
1940     @@Get:
1941     @@@disDef:
1942     @@@@GetProp: code
1943     @@Set:
1944     @@@disDef:
1945     @@@@SetProp: code
1946    
1947     @Attr:
1948     @@Name: sourceFile
1949     @@enDesc:
1950     The source file name of this fragment.
1951     @@Type:
1952 wakaba 1.12 DISLang:String::ManakaiDOM:all
1953 wakaba 1.5 @@Get:
1954     @@@enDesc:
1955     Any string identifying the source.
1956     @@@nullCase:
1957     @@@@enDesc: No source file name is set.
1958     @@@disDef:
1959     @@@@GetProp: sourceFile
1960     @@Set:
1961     @@@nullCase:
1962     @@@@enDesc: No (or unknown) source file.
1963     @@@disDef:
1964     @@@@SetProp: sourceFile
1965    
1966     @Attr:
1967     @@Name: sourceLine
1968     @@enDesc:
1969     Source file line number of the first line of this fragment.
1970     @@Type:
1971 wakaba 1.12 DOMMain:unsigned-long::ManakaiDOM:all
1972 wakaba 1.5 @@Get:
1973     @@@disDef:
1974     @@@@GetProp: sourceLine
1975     @@Set:
1976     @@@disDef:
1977     @@@@SetProp: sourceLine
1978 wakaba 1.6
1979     @ToStringMethod:
1980     @@Return:
1981     @@@Type:
1982 wakaba 1.12 DISLang:String::ManakaiDOM:all
1983 wakaba 1.6 @@@enDesc:
1984     Perl code.
1985     @@@PerlDef:
1986     my $node = $self->{<Q::TreeCore:node>};
1987     __DEEP{
1988     my $file = $self-><AG::ManakaiPerlCodeFragment.fileNode>;
1989 wakaba 1.9 $r = sprintf (qq<\n#line %d "%s (Chunk #%d)"\n>,
1990 wakaba 1.10 $node->{<Q::pc:sourceLine>} || 1,
1991     $node->{<Q::pc:sourceFile>} ||
1992     $file-><AG::ManakaiPerlFile.sourceFile>,
1993 wakaba 1.6 $file-><M::ManakaiPerlFile.getNextChunkNumber>)
1994     . $node->{<Q::pc:code>}
1995 wakaba 1.9 . sprintf (qq<\n#line 1 "%s (Chunk #%d)"\n>,
1996 wakaba 1.6 $file-><AG::ManakaiPerlFile.sourceFile>,
1997     $file-><M::ManakaiPerlFile.getNextChunkNumber>);
1998     }__;
1999 wakaba 1.1 ##PerlUnparsedCode
2000    
2001     ClsDef:
2002 wakaba 1.6 @ClsQName: ManakaiPerlInlineUnparsedCode
2003     @ClsISA: ManakaiPerlCodeFragment
2004     @enDesc:
2005     Unparsed Perl inline code fragments.
2006    
2007     @IntMethod:
2008     @@Name:newObject
2009     @@ManakaiDOM:isStatic:1
2010     @@Description:
2011     @@@lang:en
2012     @@@@:
2013     Creates a new instance object for
2014     <Class::ManakaiPerlInlineUnparsedCode>.
2015     @@Return:
2016     @@@Type:
2017     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2018     @@@Description:
2019     @@@@lang:en
2020     @@@@@:
2021     The newly created node object.
2022     @@@PerlDef:
2023     @@@@@:
2024     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2025     ::ManakaiDOM:Perl.new>;
2026     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2027     $node->{<Q::pc:code>} = '';
2028     $node->{<Q::pc:nodeType>} = 'inunparsed';
2029     @@@@ImplNote:
2030     @@@@@lang:en
2031     @@@@@@:
2032 wakaba 1.14 Properties: <Q::pc:nodeType>, <Q::pc:code>, <Q::pc:useModuleName>,
2033     <Q::pc:requireResourceURI>.
2034 wakaba 1.6
2035 wakaba 1.9 @IntCloneMethod:
2036     @@Return:
2037     @@@Type:
2038     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2039     @@@PerlDef:
2040     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2041     ::ManakaiDOM:Perl.new>;
2042     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2043     for my $prop (<Q::pc:code>) {
2044     $node->{$prop} = $nodeObject->{$prop};
2045     }
2046     $node->{<Q::pc:nodeType>} = 'inunparsed';
2047 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
2048     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
2049     $node->{<Q::pc:useModuleName>}
2050     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
2051 wakaba 1.9
2052 wakaba 1.6 @Attr:
2053     @@Name: code
2054     @@enDesc:
2055     Perl code.
2056     @@Type:
2057     lang:Perl::ManakaiDOM:all
2058     @@Get:
2059     @@@disDef:
2060     @@@@GetProp: code
2061     @@Set:
2062     @@@disDef:
2063     @@@@SetProp: code
2064    
2065     @ToStringMethod:
2066     @@Return:
2067     @@@Type:
2068 wakaba 1.12 DISLang:String::ManakaiDOM:all
2069 wakaba 1.6 @@@enDesc:
2070     Perl code.
2071     @@@PerlDef:
2072     my $node = $self->{<Q::TreeCore:node>};
2073     $r = $node->{<Q::pc:code>};
2074     ##PerlInlineUnparsedCode
2075    
2076     ClsDef:
2077     @ClsQName: ManakaiPerlStringLiteral
2078     @ClsISA: ManakaiPerlCodeFragment
2079     @enDesc:
2080     Perl string literal.
2081    
2082     @IntMethod:
2083     @@Name:newObject
2084     @@ManakaiDOM:isStatic:1
2085     @@Description:
2086     @@@lang:en
2087     @@@@:
2088     Creates a new instance object for
2089     <Class::ManakaiPerlStringLiteral>.
2090     @@Return:
2091     @@@Type:
2092     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2093     @@@Description:
2094     @@@@lang:en
2095     @@@@@:
2096     The newly created node object.
2097     @@@PerlDef:
2098     @@@@@:
2099     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2100     ::ManakaiDOM:Perl.new>;
2101     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2102     $node->{<Q::infoset:data>} = '';
2103     $node->{<Q::pc:nodeType>} = 'string';
2104     @@@@ImplNote:
2105     @@@@@lang:en
2106     @@@@@@:
2107 wakaba 1.14 Properties: <Q::pc:nodeType>,
2108     <Q::infoset:data>, <Q::pc:useModuleName>,
2109     <Q::pc:requireResourceURI>.
2110 wakaba 1.6
2111 wakaba 1.9 @IntCloneMethod:
2112     @@Return:
2113     @@@Type:
2114     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2115     @@@PerlDef:
2116     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2117     ::ManakaiDOM:Perl.new>;
2118     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2119     for my $prop (<Q::infoset:data>) {
2120     $node->{$prop} = $nodeObject->{$prop};
2121     }
2122     $node->{<Q::pc:nodeType>} = 'string';
2123 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
2124     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
2125     $node->{<Q::pc:useModuleName>}
2126     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
2127 wakaba 1.9
2128 wakaba 1.6 @Attr:
2129     @@Name: data
2130     @@enDesc:
2131     String data.
2132     @@Type:
2133     DISLang:String::ManakaiDOM:all
2134     @@Get:
2135     @@@disDef:
2136     @@@@GetProp:
2137     infoset:data
2138     @@Set:
2139     @@@disDef:
2140     @@@@SetProp:
2141     infoset:data
2142    
2143 wakaba 1.14 @NumValMethod:
2144     @@Return:
2145     @@@Type:
2146     DISIDL:AnyRealNumber::ManakaiDOM:all
2147     @@@enDesc:
2148     Numeric value of the Perl code.
2149     @@@PerlDef:
2150     $r = 0 + $self->{<Q::TreeCore:node>}->{<Q::infoset:data>};
2151    
2152 wakaba 1.6 @ToStringMethod:
2153     @@Return:
2154     @@@Type:
2155 wakaba 1.12 DISLang:String::ManakaiDOM:all
2156 wakaba 1.6 @@@enDesc:
2157     Perl code.
2158     @@@PerlDef:
2159     my $node = $self->{<Q::TreeCore:node>};
2160     $r = $node->{<Q::infoset:data>};
2161     $r =~ s/(['\\])/\\$1/g;
2162     $r = q<'> . $r . q<'>;
2163     ##PerlStringLiteral
2164    
2165 wakaba 1.12 ## TODO: -> Separate module
2166     PropDef:
2167     @QName:
2168     infoset:data
2169    
2170 wakaba 1.6 ClsDef:
2171     @ClsQName: ManakaiPerlBare
2172     @ClsISA: ManakaiPerlCodeFragment
2173     @enDesc:
2174     Unparsed Perl inline code fragments.
2175    
2176     @IntMethod:
2177     @@Name:newObject
2178     @@ManakaiDOM:isStatic:1
2179     @@Description:
2180     @@@lang:en
2181     @@@@:
2182     Creates a new instance object for
2183     <Class::ManakaiPerlInlineBare>.
2184     @@Return:
2185     @@@Type:
2186     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2187     @@@Description:
2188     @@@@lang:en
2189     @@@@@:
2190     The newly created node object.
2191     @@@PerlDef:
2192     @@@@@:
2193     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2194     ::ManakaiDOM:Perl.new>;
2195     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2196     $node->{<Q::pc:code>} = '';
2197     $node->{<Q::pc:nodeType>} = 'bare';
2198     @@@@ImplNote:
2199     @@@@@lang:en
2200     @@@@@@:
2201 wakaba 1.14 Properties: <Q::pc:nodeType>, <Q::pc:code>, <Q::pc:useModuleName>,
2202     <Q::pc:requireResourceURI>.
2203 wakaba 1.6
2204 wakaba 1.9 @IntCloneMethod:
2205     @@Return:
2206     @@@Type:
2207     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2208     @@@PerlDef:
2209     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2210     ::ManakaiDOM:Perl.new>;
2211     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2212     for my $prop (<Q::pc:code>) {
2213     $node->{$prop} = $nodeObject->{$prop};
2214     }
2215     $node->{<Q::pc:nodeType>} = 'bare';
2216 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
2217     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
2218     $node->{<Q::pc:useModuleName>}
2219     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
2220 wakaba 1.9
2221 wakaba 1.6 @Attr:
2222     @@Name: code
2223     @@enDesc:
2224     Perl code.
2225     @@Type:
2226     lang:Perl::ManakaiDOM:all
2227     @@Get:
2228     @@@disDef:
2229     @@@@GetProp: code
2230     @@Set:
2231     @@@disDef:
2232     @@@@SetProp: code
2233    
2234     @ToStringMethod:
2235     @@Return:
2236     @@@Type:
2237 wakaba 1.12 DISLang:String::ManakaiDOM:all
2238 wakaba 1.6 @@@enDesc:
2239     Perl code.
2240     @@@PerlDef:
2241     my $node = $self->{<Q::TreeCore:node>};
2242     $r = $node->{<Q::pc:code>};
2243     ##PerlBare
2244    
2245     ClsDef:
2246     @ClsQName: ManakaiPerlAtom
2247     @ClsISA: ManakaiPerlBare
2248     @enDesc:
2249     Unparsed Perl atomic code fragments (such as numeric literal).
2250    
2251     @IntMethod:
2252     @@Name:newObject
2253     @@ManakaiDOM:isStatic:1
2254     @@Description:
2255     @@@lang:en
2256     @@@@:
2257     Creates a new instance object for
2258     <Class::ManakaiPerlAtom>.
2259     @@Return:
2260     @@@Type:
2261     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2262     @@@Description:
2263     @@@@lang:en
2264     @@@@@:
2265     The newly created node object.
2266     @@@PerlDef:
2267     @@@@@:
2268     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2269     ::ManakaiDOM:Perl.new>;
2270     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2271     $node->{<Q::pc:code>} = '';
2272     $node->{<Q::pc:nodeType>} = 'atom';
2273     @@@@ImplNote:
2274     @@@@@lang:en
2275     @@@@@@:
2276 wakaba 1.14 Properties: <Q::pc:nodeType>, <Q::pc:code>, <Q::pc:useModuleName>,
2277     <Q::pc:requireResourceURI>.
2278 wakaba 1.6
2279 wakaba 1.9 @IntCloneMethod:
2280     @@Return:
2281     @@@Type:
2282     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2283     @@@PerlDef:
2284     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2285     ::ManakaiDOM:Perl.new>;
2286     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2287     for my $prop (<Q::pc:code>) {
2288     $node->{$prop} = $nodeObject->{$prop};
2289     }
2290     $node->{<Q::pc:nodeType>} = 'atom';
2291 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
2292     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
2293     $node->{<Q::pc:useModuleName>}
2294     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
2295    
2296     @NumValMethod:
2297     @@Return:
2298     @@@Type:
2299     DISIDL:AnyRealNumber::ManakaiDOM:all
2300     @@@enDesc:
2301     Numeric value of the Perl code.
2302     @@@PerlDef:
2303     $r = 0 + $self->{<Q::TreeCore:node>}->{<Q::pc:code>};
2304 wakaba 1.9
2305 wakaba 1.6 @ToStringMethod:
2306     @@Return:
2307     @@@Type:
2308 wakaba 1.12 DISLang:String::ManakaiDOM:all
2309 wakaba 1.6 @@@enDesc:
2310     Perl code.
2311     @@@PerlDef:
2312     my $node = $self->{<Q::TreeCore:node>};
2313     $r = $node->{<Q::pc:code>};
2314     ##PerlAtom
2315    
2316     ClsDef:
2317     @ClsQName: ManakaiPerlVariable
2318     @ClsISA: ManakaiPerlCodeFragment
2319     @enDesc:
2320     Unparsed Perl variable.
2321     \
2322     {NOTE:: Future version of the implementation may
2323     support to specify array index or hash key.
2324     \
2325     }
2326    
2327     @IntMethod:
2328     @@Name:newObject
2329     @@ManakaiDOM:isStatic:1
2330     @@Description:
2331     @@@lang:en
2332     @@@@:
2333     Creates a new instance object for
2334     <Class::ManakaiPerlVariable>.
2335     @@Return:
2336     @@@Type:
2337     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2338     @@@Description:
2339     @@@@lang:en
2340     @@@@@:
2341     The newly created node object.
2342     @@@PerlDef:
2343     @@@@@:
2344     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2345     ::ManakaiDOM:Perl.new>;
2346     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2347     $node->{<Q::pc:variableType>} = '';
2348     $node->{<Q::pc:nodeType>} = 'variable';
2349     @@@@ImplNote:
2350     @@@@@lang:en
2351     @@@@@@:
2352     Properties: <Q::pc:nodeType>, <Q::pc:variableType>,
2353     <Q::packageName>, <Q::localName> (required),
2354 wakaba 1.14 <Q::variableScope>, <Q::hashKey>, <Q::pc:useModuleName>,
2355     <Q::pc:requireResourceURI>.
2356 wakaba 1.9
2357     @IntCloneMethod:
2358     @@Return:
2359     @@@Type:
2360     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2361     @@@PerlDef:
2362     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2363     ::ManakaiDOM:Perl.new>;
2364     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2365     for my $prop (<Q::pc:variableType>, <Q::packageName>,
2366     <Q::localName>, <Q::variableScope>, <Q::hashKey>) {
2367     $node->{$prop} = $nodeObject->{$prop};
2368     }
2369     $node->{<Q::pc:nodeType>} = 'variable';
2370 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
2371     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
2372     $node->{<Q::pc:useModuleName>}
2373     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
2374 wakaba 1.6
2375     @Attr:
2376     @@Name: variableType
2377     @@enDesc:
2378     Perl variable type (<CODE::$>, <CODE::@>, <CODE::%>,
2379     <CODE::&> or empty string).
2380     @@Type:
2381     lang:Perl::ManakaiDOM:all
2382     @@Get:
2383     @@@disDef:
2384     @@@@GetProp: variableType
2385     @@Set:
2386     @@@disDef:
2387     @@@@SetProp: variableType
2388    
2389     @Attr:
2390     @@Name: packageName
2391     @@enDesc:
2392     The name of the package to which this variable belongs.
2393     @@Type:
2394     Perl:package-name::ManakaiDOM:all
2395     @@Get:
2396     @@@nullCase:
2397     @@@@enDesc:
2398     This package belongs to the current package or
2399     does not belong to any package.
2400     @@@disDef:
2401     @@@@GetProp: packageName
2402     @@Set:
2403     @@@nullCase:
2404     @@@@enDesc:
2405     This package belongs to the current package or
2406     does not belong to any package.
2407     @@@disDef:
2408 wakaba 1.11 @@@@SetProp: packageName
2409 wakaba 1.6
2410     @Attr:
2411     @@Name: localName
2412     @@enDesc:
2413     The local variable name.
2414     @@Type:
2415     lang:Perl::ManakaiDOM:all
2416     @@Get:
2417     @@@disDef:
2418     @@@@GetProp: localName
2419     @@Set:
2420     @@@disDef:
2421     @@@@SetProp: localName
2422    
2423     @Attr:
2424     @@Name: variableScope
2425     @@enDesc:
2426     Scope modifier (<CODE::my> or <CODE::our> or <CODE::local>).
2427     @@Type:
2428     lang:Perl::ManakaiDOM:all
2429     @@Get:
2430     @@@nullCase:
2431     @@@@enDesc:
2432     This variable does not have scope modifier.
2433     @@@disDef:
2434     @@@@GetProp: variableScope
2435     @@Set:
2436     @@@nullCase:
2437     @@@@enDesc:
2438     This variable does not have scope modifier.
2439     @@@disDef:
2440     @@@@SetProp: variableScope
2441    
2442     @ToStringMethod:
2443     @@Return:
2444     @@@Type:
2445 wakaba 1.12 DISLang:String::ManakaiDOM:all
2446 wakaba 1.6 @@@enDesc:
2447     Perl code.
2448     @@@PerlDef:
2449     my $node = $self->{<Q::TreeCore:node>};
2450 wakaba 1.11 if ($node->{<Q::pc:variableScope>}) {
2451     $r = $node->{<Q::pc:variableScope>} . ' ';
2452     }
2453     $r .= $node->{<Q::pc:variableType>};
2454 wakaba 1.6 $r .= $node->{<Q::pc:packageName>} . '::'
2455     if defined $node->{<Q::pc:packageName>};
2456     $r .= $node->{<Q::pc:localName>};
2457     if ($node->{<Q::pc:variableType>} eq '$' and
2458     defined $node->{<Q::pc:hashKey>}) {
2459     my $hashKey = $node->{<Q::pc:hashKey>};
2460     $hashKey =~ s/(['\\])/\\$1/g;
2461     $r .= q<{'> . $hashKey . q<'}>;
2462     }
2463    
2464     @Attr:
2465     @@Name: hashKey
2466     @@enDesc:
2467     The key for hash.
2468     \
2469     {NOTE:: Using Perl code for key is not supported in the current
2470     version of the implementation.
2471     \
2472     }
2473     @@Type:
2474     DISLang:String::ManakaiDOM:all
2475     @@Get:
2476     @@@nullCase:
2477     @@@@enDesc:
2478     This variable is not for hash value access.
2479     @@@disDef:
2480     @@@@GetProp: hashKey
2481     @@Set:
2482     @@@nullCase:
2483     @@@@enDesc:
2484     This variable is not for hash value access.
2485     @@@disDef:
2486     @@@@SetProp: hashKey
2487 wakaba 1.15 ##PerlVariable
2488 wakaba 1.6
2489     PropDef:
2490     @QName: variableScope
2491     @enDesc:
2492     Variable scope (<CODE::local>, <CODE::my> or <CODE::our>).
2493    
2494     PropDef:
2495     @QName: variableType
2496     @enDesc:
2497     Variable type prefix.
2498    
2499     PropDef:
2500     @QName: hashKey
2501     @enDesc:
2502     Hash key string.
2503    
2504     ClsDef:
2505     @ClsQName: ManakaiPerlAnyContainer
2506     @ClsISA: ManakaiPerlCodeFragment
2507     @enDesc:
2508     A base class implemented by both inline container and
2509     block-level container.
2510    
2511     @Attr:
2512     @@Name: length
2513     @@enDesc:
2514     The number of child code fragments.
2515     @@Type:
2516 wakaba 1.12 DOMMain:unsigned-long::ManakaiDOM:all
2517 wakaba 1.6 @@Get:
2518     @@@PerlDef:
2519     $r = @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}};
2520    
2521     @Method:
2522     @@Name: appendStringLiteral
2523     @@enDesc:
2524     Appends a Perl string literal (<CODE::q>).
2525     @@Param:
2526     @@@Name: stringArg
2527     @@@Type:
2528     DISLang:String::ManakaiDOM:all
2529     @@@enDesc:
2530     A string.
2531     @@Return:
2532     @@@Type: ManakaiPerlStringLiteral
2533     @@@enDesc:
2534     The newly created Perl string literal object.
2535     @@@PerlDef:
2536     $r = <ClassM::ManakaiPerlStringLiteral.newObject>;
2537     my $node = $self->{<Q::TreeCore:node>};
2538     $r->{<Q::infoset:data>} = $stringArg;
2539     $node-><M::ManakaiDOM:ManakaiDOMNodeObject
2540     ::ManakaiDOM:Perl.importTree> ($r);
2541     push @{$node->{<Q::pc:childNodes>}}, $r;
2542     $r->{<Q::pc:parent>} = $node;
2543     if (defined wantarray) {
2544     __CODE{ManakaiNode:getNewReference::
2545     $object => $r, $ref => $r,
2546     $class =>{<ClassName::ManakaiPerlStringLiteral>},
2547     }__;
2548     }
2549    
2550    
2551     @Method:
2552     @@Name: appendAtom
2553     @@enDesc:
2554     Appends a Perl atomic code fragment.
2555     @@Param:
2556     @@@Name: codeArg
2557     @@@Type:
2558     lang:Perl::ManakaiDOM:all
2559     @@@enDesc:
2560     An atom.
2561     @@Return:
2562     @@@Type: ManakaiPerlAtom
2563     @@@enDesc:
2564     The newly created Perl code object.
2565     @@@PerlDef:
2566     $r = <ClassM::ManakaiPerlAtom.newObject>;
2567     my $node = $self->{<Q::TreeCore:node>};
2568 wakaba 1.7 $r->{<Q::pc:code>} = $codeArg;
2569 wakaba 1.6 $node-><M::ManakaiDOM:ManakaiDOMNodeObject
2570     ::ManakaiDOM:Perl.importTree> ($r);
2571     push @{$node->{<Q::pc:childNodes>}}, $r;
2572     $r->{<Q::pc:parent>} = $node;
2573     if (defined wantarray) {
2574     __CODE{ManakaiNode:getNewReference::
2575     $object => $r, $ref => $r,
2576     $class =>{<ClassName::ManakaiPerlAtom>},
2577     }__;
2578     }
2579    
2580    
2581     @Method:
2582     @@Name: appendBare
2583     @@enDesc:
2584     Appends a Perl bare code fragment.
2585     @@Param:
2586     @@@Name: codeArg
2587     @@@Type:
2588     lang:Perl::ManakaiDOM:all
2589     @@@enDesc:
2590 wakaba 1.7 An bare code.
2591 wakaba 1.6 @@Return:
2592     @@@Type: ManakaiPerlBare
2593     @@@enDesc:
2594     The newly created Perl code object.
2595     @@@PerlDef:
2596     $r = <ClassM::ManakaiPerlBare.newObject>;
2597     my $node = $self->{<Q::TreeCore:node>};
2598 wakaba 1.7 $r->{<Q::pc:code>} = $codeArg;
2599 wakaba 1.6 $node-><M::ManakaiDOM:ManakaiDOMNodeObject
2600     ::ManakaiDOM:Perl.importTree> ($r);
2601     push @{$node->{<Q::pc:childNodes>}}, $r;
2602     $r->{<Q::pc:parent>} = $node;
2603     if (defined wantarray) {
2604     __CODE{ManakaiNode:getNewReference::
2605     $object => $r, $ref => $r,
2606     $class =>{<ClassName::ManakaiPerlBare>},
2607     }__;
2608     }
2609 wakaba 1.11
2610     @Method:
2611     @@Name: appendNewAssignment
2612     @@enDesc:
2613     Appends a newly created <Class::ManakaiPerlAssign> object.
2614     @@Param:
2615     @@@Name: leftArg
2616     @@@Type: ManakaiPerlCodeFragment
2617     @@@enDesc:
2618     A left hand side code fragment object.
2619     @@Param:
2620     @@@Name: rightArg
2621     @@@Type: ManakaiPerlCodeFragment
2622     @@@enDesc:
2623     A right hand side code fragment object.
2624     @@Return:
2625     @@@RaiseException:
2626     @@@@@:BAD_CHILD_ERR
2627     @@@@enDesc:
2628     An attempt is made to append a child
2629     that is not valid type.
2630     @@@RaiseException:
2631     @@@@@:IN_USE_NODE_ERR
2632     @@@@enDesc:
2633     An attempt is made to append a node that is
2634     already used elsewhere.
2635     @@@PerlDef:
2636     for my $arg ([leftArg => $leftArg], [rightArg => $rightArg]) {
2637     if ({
2638     atom => 1, bare => 1, incontainer => 1, assign => true,
2639     inunparsed => 1, variable => 1, string => true,
2640     }->{$arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:nodeType>}}) {
2641     if ($arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
2642     __EXCEPTION{IN_USE_NODE_ERR::
2643     pc:childNode => {$arg->[1]},
2644     MDOMX:param-name => {$arg->[0]},
2645     }__;
2646     }
2647     } else {
2648     __EXCEPTION{BAD_CHILD_ERR::
2649     pc:parentNode => {$self},
2650     pc:childNode => {$arg->[1]},
2651     MDOMX:param-name => {$arg->[0]},
2652     }__;
2653     }
2654     } # left/right
2655    
2656     my $assign = <ClassM::ManakaiPerlAssignment.newObject>;
2657     $assign->{<Q::pc:left>} = $leftArg->{<Q::TreeCore:node>};
2658     $assign->{<Q::pc:right>} = $rightArg->{<Q::TreeCore:node>};
2659     $leftArg->{<Q::TreeCore:node>}->{<Q::pc:parent>} = $assign;
2660     $rightArg->{<Q::TreeCore:node>}->{<Q::pc:parent>} = $assign;
2661     $self->{<Q::TreeCore:node>}-><M::MNodeObject.importTree> ($assign);
2662     $assign->{<Q::pc:parent>} = $self->{<Q::TreeCore:node>};
2663     push @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}}, $assign;
2664 wakaba 1.8 ##PerlAnyContainer
2665 wakaba 1.6
2666 wakaba 1.8 ClsDef:
2667     @ClsQName: ManakaiPerlStatement
2668     @ClsISA: ManakaiPerlInlineContainer
2669     @enDesc:
2670     Perl statements.
2671    
2672     @IntMethod:
2673     @@Name:newObject
2674     @@ManakaiDOM:isStatic:1
2675     @@Description:
2676     @@@lang:en
2677     @@@@:
2678     Creates a new instance object for
2679     <Class::ManakaiPerlStatement>.
2680     @@Return:
2681     @@@Type:
2682     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2683     @@@Description:
2684     @@@@lang:en
2685     @@@@@:
2686     The newly created node object.
2687     @@@PerlDef:
2688     @@@@@:
2689     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2690     ::ManakaiDOM:Perl.new>;
2691     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2692 wakaba 1.11 push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
2693 wakaba 1.8 $node->{<Q::pc:childNodes>} = [];
2694     $node->{<Q::pc:nodeType>} = 'statement';
2695     @@@@ImplNote:
2696     @@@@@lang:en
2697     @@@@@@:
2698 wakaba 1.14 Properties: <Q::pc:nodeType>, <Q::pc:childNodes>,
2699     <Q::pc:parent>, <Q::pc:useModuleName>,
2700     <Q::pc:requireResourceURI>.
2701 wakaba 1.9
2702     @IntCloneMethod:
2703     @@Return:
2704     @@@Type:
2705     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2706     @@@PerlDef:
2707     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2708     ::ManakaiDOM:Perl.new>;
2709     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2710     $node->{<Q::pc:nodeType>} = 'statement';
2711 wakaba 1.11 push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
2712 wakaba 1.9 $node->{<Q::pc:childNodes>} = [];
2713     for my $cno (@{$nodeObject->{<Q::pc:childNodes>}}) {
2714     my $pack;
2715     my $nt = $cno->{<Q::pc:nodeType>};
2716     __CODE{pc:nodeTypeToPackageName::
2717     $nodeType => $nt, $packageName => $pack, $object => $cno}__;
2718     ## NOTE: Method name written directly
2719 wakaba 1.15 my $cno_clone = $pack->_make_clone_object ($cno);
2720 wakaba 1.9 push @{$node->{<Q::pc:childNodes>}}, $cno_clone;
2721     $cno_clone->{<Q::pc:parent>} = $node;
2722     ## NOTE: Tree ID is not updated yet.
2723     }
2724 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
2725     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
2726     $node->{<Q::pc:useModuleName>}
2727     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
2728 wakaba 1.8
2729     @ToStringMethod:
2730     @@Return:
2731     @@@Type:
2732 wakaba 1.12 DISLang:String::ManakaiDOM:all
2733 wakaba 1.8 @@@enDesc:
2734     Perl code.
2735     @@@PerlDef:
2736     $r = $self->SUPER::stringify;
2737 wakaba 1.16 $r .= ";\n" if length $r;
2738 wakaba 1.8 ##PerlStatement
2739 wakaba 1.6
2740     ClsDef:
2741     @ClsQName: ManakaiPerlInlineContainer
2742     @ClsISA: ManakaiPerlAnyContainer
2743     @enDesc:
2744     Unparsed Perl inline code block.
2745    
2746     @IntMethod:
2747     @@Name:newObject
2748     @@ManakaiDOM:isStatic:1
2749     @@Description:
2750     @@@lang:en
2751     @@@@:
2752     Creates a new instance object for
2753     <Class::ManakaiPerlInlineContainer>.
2754     @@Return:
2755     @@@Type:
2756     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2757     @@@Description:
2758     @@@@lang:en
2759     @@@@@:
2760     The newly created node object.
2761     @@@PerlDef:
2762     @@@@@:
2763     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2764     ::ManakaiDOM:Perl.new>;
2765     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2766 wakaba 1.11 push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
2767 wakaba 1.6 $node->{<Q::pc:childNodes>} = [];
2768     $node->{<Q::pc:nodeType>} = 'incontainer';
2769     @@@@ImplNote:
2770     @@@@@lang:en
2771     @@@@@@:
2772 wakaba 1.9 Properties: <Q::pc:nodeType>, <Q::pc:childNodes>,
2773 wakaba 1.14 <Q::pc:parent>, <Q::pc:useModuleName>,
2774     <Q::pc:requireResourceURI>.
2775 wakaba 1.9
2776     @IntCloneMethod:
2777     @@Return:
2778     @@@Type:
2779     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2780     @@@PerlDef:
2781     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2782     ::ManakaiDOM:Perl.new>;
2783     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2784 wakaba 1.11 push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
2785 wakaba 1.9 $node->{<Q::pc:nodeType>} = 'incontainer';
2786     $node->{<Q::pc:childNodes>} = [];
2787     for my $cno (@{$nodeObject->{<Q::pc:childNodes>}}) {
2788     my $pack;
2789     my $nt = $cno->{<Q::pc:nodeType>};
2790     __CODE{pc:nodeTypeToPackageName::
2791     $nodeType => $nt, $packageName => $pack, $object => $cno}__;
2792     ## NOTE: Method name written directly
2793 wakaba 1.15 my $cno_clone = $pack->_make_clone_object ($cno);
2794 wakaba 1.9 push @{$node->{<Q::pc:childNodes>}}, $cno_clone;
2795     $cno_clone->{<Q::pc:parent>} = $node;
2796     ## NOTE: Tree ID is not updated yet.
2797     }
2798 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
2799     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
2800     $node->{<Q::pc:useModuleName>}
2801     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
2802 wakaba 1.6
2803     @Method:
2804     @@Name: appendCodeFragment
2805     @@enDesc:
2806     Appends a <Class::ManakaiPerlCodeFragment> object.
2807     @@Param:
2808     @@@Name: codeArg
2809     @@@Type: ManakaiPerlCodeFragment
2810     @@@enDesc:
2811     A code fragment object.
2812     @@Return:
2813     @@@RaiseException:
2814     @@@@@:BAD_CHILD_ERR
2815     @@@@enDesc:
2816     An attempt is made to append a child
2817     that is not a <Class::ManakaiPerlUnparsedCode>.
2818     @@@RaiseException:
2819     @@@@@:IN_USE_NODE_ERR
2820     @@@@enDesc:
2821     An attempt is made to append a node that is
2822     already used elsewhere.
2823     @@@PerlDef:
2824     if ({
2825 wakaba 1.11 atom => 1, bare => 1, incontainer => 1, assign => true,
2826     inunparsed => 1, variable => 1, string => 1,
2827 wakaba 1.6 }->{$codeArg->{<Q::TreeCore:node>}->{<Q::pc:nodeType>}}) {
2828     if ($codeArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
2829     __EXCEPTION{IN_USE_NODE_ERR::
2830     pc:childNode => {$codeArg},
2831     }__;
2832     }
2833     $self->{<Q::TreeCore:node>}-><M::MNodeObject.importTree>
2834     ($codeArg->{<Q::TreeCore:node>});
2835     push @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}},
2836     $codeArg->{<Q::TreeCore:node>};
2837     $codeArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}
2838     = $self->{<Q::TreeCore:node>};
2839     } else {
2840     __EXCEPTION{BAD_CHILD_ERR::
2841     pc:parentNode => {$self},
2842     pc:childNode => {$codeArg},
2843     }__;
2844     }
2845    
2846     @Method:
2847     @@Name: appendCode
2848     @@enDesc:
2849     Appends an unparsed Perl code fragment.
2850     @@Param:
2851     @@@Name: codeArg
2852     @@@Type:
2853     lang:Perl::ManakaiDOM:all
2854     @@@enDesc:
2855     An unparsed Perl code fragment.
2856     @@Return:
2857     @@@Type: ManakaiPerlInlineUnparsedCode
2858     @@@enDesc:
2859     The newly created Perl code object.
2860     @@@PerlDef:
2861     $r = <ClassM::ManakaiPerlInlineUnparsedCode.newObject>;
2862     my $node = $self->{<Q::TreeCore:node>};
2863     $r->{<Q::code>} = $codeArg;
2864     $node-><M::ManakaiDOM:ManakaiDOMNodeObject
2865     ::ManakaiDOM:Perl.importTree> ($r);
2866     push @{$node->{<Q::pc:childNodes>}}, $r;
2867     $r->{<Q::pc:parent>} = $node;
2868     if (defined wantarray) {
2869     __CODE{ManakaiNode:getNewReference::
2870     $object => $r, $ref => $r,
2871     $class =>{<ClassName::ManakaiPerlInlineUnparsedCode>},
2872     }__;
2873     }
2874    
2875     @ToStringMethod:
2876     @@Return:
2877     @@@Type:
2878 wakaba 1.12 DISLang:String::ManakaiDOM:all
2879 wakaba 1.6 @@@enDesc:
2880     Perl code.
2881     @@@PerlDef:
2882     for my $cno (@{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}}) {
2883 wakaba 1.7 my $cn = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($cno);
2884 wakaba 1.6 if ($cno->{<Q::pc:nodeType>} eq 'incontainer' and
2885     \ @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}} == 1) {
2886     $r .= '(' . $cn->stringify . ')';
2887     } else {
2888     $r .= $cn->stringify;
2889     }
2890     }
2891     ##PerlInlineContainer
2892    
2893 wakaba 1.8 ClsDef:
2894     @ClsQName: ManakaiPerlBlock
2895     @ClsISA: ManakaiPerlStatementContainer
2896     @enDesc:
2897     Perl block-level code block.
2898    
2899     @IntMethod:
2900     @@Name:newObject
2901     @@ManakaiDOM:isStatic:1
2902     @@Description:
2903     @@@lang:en
2904     @@@@:
2905     Creates a new instance object for
2906     <Class::ManakaiPerlBlock>.
2907     @@Return:
2908     @@@Type:
2909     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2910     @@@Description:
2911     @@@@lang:en
2912     @@@@@:
2913     The newly created node object.
2914     @@@PerlDef:
2915     @@@@@:
2916     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2917     ::ManakaiDOM:Perl.new>;
2918     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2919 wakaba 1.11 push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
2920 wakaba 1.8 $node->{<Q::pc:childNodes>} = [];
2921     $node->{<Q::pc:nodeType>} = 'block';
2922     @@@@ImplNote:
2923     @@@@@lang:en
2924     @@@@@@:
2925 wakaba 1.9 Properties: <Q::pc:nodeType>, <Q::pc:childNodes>, <Q::pc:label>,
2926 wakaba 1.10 <Q::pc:parent>, <Q::pc:sourceFile>, <Q::pc:sourceLine>,
2927 wakaba 1.14 <Q::pc:currentSoruceFile>,
2928     <Q::pc:currentSourceLine>, <Q::pc:useModuleName>,
2929     <Q::pc:requireResourceURI>.
2930 wakaba 1.9
2931     @IntCloneMethod:
2932     @@Return:
2933     @@@Type:
2934     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
2935     @@@PerlDef:
2936     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
2937     ::ManakaiDOM:Perl.new>;
2938     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
2939 wakaba 1.11 push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
2940 wakaba 1.9 $node->{<Q::pc:nodeType>} = 'block';
2941     $node->{<Q::pc:childNodes>} = [];
2942     for my $cno (@{$nodeObject->{<Q::pc:childNodes>}}) {
2943     my $pack;
2944     my $nt = $cno->{<Q::pc:nodeType>};
2945     __CODE{pc:nodeTypeToPackageName::
2946     $nodeType => $nt, $packageName => $pack, $object => $cno}__;
2947     ## NOTE: Method name written directly
2948     my $cno_clone = $pack->_make_clone_object ($cno);
2949     push @{$node->{<Q::pc:childNodes>}}, $cno_clone;
2950     $cno_clone->{<Q::pc:parent>} = $node;
2951     ## NOTE: Tree ID is not updated yet.
2952     }
2953 wakaba 1.10 for my $prop (<Q::pc:label>, <Q::pc:sourceFile>, <Q::pc:sourceLine>,
2954     <Q::pc:currentSourceFile>, <Q::pc:currentSourceLine>) {
2955     $node->{$prop} = $nodeObject->{$prop};
2956     }
2957 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
2958     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
2959     $node->{<Q::pc:useModuleName>}
2960     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
2961 wakaba 1.8
2962     @ToStringMethod:
2963     @@Return:
2964     @@@Type:
2965 wakaba 1.12 DISLang:String::ManakaiDOM:all
2966 wakaba 1.8 @@@enDesc:
2967     Perl code.
2968     @@@PerlDef:
2969 wakaba 1.9 my $node = $self->{<Q::TreeCore:node>};
2970     if (@{$node->{<Q::pc:childNodes>}} == 1 and
2971     $node->{<Q::pc:childNodes>}->[0]->{<Q::pc:nodeType>} eq 'block') {
2972     my $cn;
2973     __CODE{ManakaiNode:getWeakReference::
2974     $object => {$node->{<Q::pc:childNodes>}->[0]},
2975     $ref => $cn,
2976     $class => {<ClassName::ManakaiPerlBlock>}}__;
2977     $r = $cn->stringify;
2978     } else {
2979     for my $cno (@{$node->{<Q::pc:childNodes>}}) {
2980     my $cn = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($cno);
2981     if ($cno->{<Q::pc:nodeType>} eq 'incontainer' and
2982     \ @{$node->{<Q::pc:childNodes>}} == 1) {
2983     $r .= '(' . $cn->stringify . ')';
2984     } else {
2985     $r .= $cn->stringify;
2986     }
2987 wakaba 1.8 }
2988 wakaba 1.9 __DEEP{
2989     my $file = $self-><AG::ManakaiPerlCodeFragment.fileNode>;
2990     $r = sprintf (qq<\n{\n#line %d "%s (Chunk #%d)"\n>,
2991 wakaba 1.10 $node->{<Q::pc:sourceLine>} || 1,
2992     $node->{<Q::pc:sourceFile>} ||
2993     $file-><AG::ManakaiPerlFile.sourceFile>,
2994 wakaba 1.9 $file-><M::ManakaiPerlFile.getNextChunkNumber>)
2995     . $r
2996     . sprintf (qq<\n#line 1 "%s (Chunk #%d)"\n}\n>,
2997     $file-><AG::ManakaiPerlFile.sourceFile>,
2998     $file-><M::ManakaiPerlFile.getNextChunkNumber>);
2999     }__;
3000 wakaba 1.8 }
3001    
3002     ##PerlBlock
3003    
3004 wakaba 1.9 ClsDef:
3005     @ClsQName: ManakaiPerlBlockContainer
3006     @ClsISA: ManakaiPerlStatementContainer
3007     @enDesc:
3008     Perl block-level code container whose content may or may
3009     not semantically be self-contained.
3010    
3011     @IntMethod:
3012     @@Name:newObject
3013     @@ManakaiDOM:isStatic:1
3014     @@Description:
3015     @@@lang:en
3016     @@@@:
3017     Creates a new instance object for
3018     <Class::ManakaiPerlBlockContainer>.
3019     @@Return:
3020     @@@Type:
3021     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
3022     @@@Description:
3023     @@@@lang:en
3024     @@@@@:
3025     The newly created node object.
3026     @@@PerlDef:
3027     @@@@@:
3028     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
3029     ::ManakaiDOM:Perl.new>;
3030     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
3031 wakaba 1.11 push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
3032 wakaba 1.9 $node->{<Q::pc:childNodes>} = [];
3033     $node->{<Q::pc:nodeType>} = 'blockcontainer';
3034     @@@@ImplNote:
3035     @@@@@lang:en
3036     @@@@@@:
3037 wakaba 1.10 Properties: <Q::pc:nodeType>, <Q::pc:childNodes>,
3038     <Q::pc:parent>, <Q::pc:sourceFile>, <Q::pc:sourceLine>,
3039 wakaba 1.14 <Q::pc:currentSourceFile>,
3040     <Q::pc:currentSourceLine>, <Q::pc:useModuleName>,
3041     <Q::pc:requireResourceURI>.
3042 wakaba 1.9
3043     @IntCloneMethod:
3044     @@Return:
3045     @@@Type:
3046     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
3047     @@@PerlDef:
3048     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
3049     ::ManakaiDOM:Perl.new>;
3050     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
3051 wakaba 1.11 push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
3052 wakaba 1.9 $node->{<Q::pc:nodeType>} = 'blockcontainer';
3053     $node->{<Q::pc:childNodes>} = [];
3054     for my $cno (@{$nodeObject->{<Q::pc:childNodes>}}) {
3055     my $pack;
3056     my $nt = $cno->{<Q::pc:nodeType>};
3057     __CODE{pc:nodeTypeToPackageName::
3058     $nodeType => $nt, $packageName => $pack, $object => $cno}__;
3059     ## NOTE: Method name written directly
3060     my $cno_clone = $pack->_make_clone_object ($cno);
3061     push @{$node->{<Q::pc:childNodes>}}, $cno_clone;
3062     $cno_clone->{<Q::pc:parent>} = $node;
3063     ## NOTE: Tree ID is not updated yet.
3064     }
3065 wakaba 1.10 for my $prop (<Q::pc:sourceFile>, <Q::pc:sourceLine>,
3066     <Q::pc:currentSourceFile>, <Q::pc:currentSourceLine>) {
3067     $node->{$prop} = $nodeObject->{$prop};
3068     }
3069 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
3070     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
3071     $node->{<Q::pc:useModuleName>}
3072     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
3073 wakaba 1.9
3074     @ToStringMethod:
3075     @@Return:
3076     @@@Type:
3077 wakaba 1.12 DISLang:String::ManakaiDOM:all
3078 wakaba 1.9 @@@enDesc:
3079     Perl code.
3080     @@@PerlDef:
3081     my $node = $self->{<Q::TreeCore:node>};
3082     if (@{$node->{<Q::pc:childNodes>}} == 1 and
3083     {
3084     block => true, blockcontainer => true,
3085     }->{$node->{<Q::pc:childNodes>}->[0]->{<Q::pc:nodeType>}}) {
3086     my $cn;
3087     __CODE{ManakaiNode:getWeakReference::
3088     $object => {$node->{<Q::pc:childNodes>}->[0]},
3089     $ref => $cn,
3090     $class => {<ClassName::ManakaiPerlBlock>}}__;
3091     $r = $cn->stringify;
3092     } else {
3093     for my $cno (@{$node->{<Q::pc:childNodes>}}) {
3094     my $cn = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($cno);
3095     if ($cno->{<Q::pc:nodeType>} eq 'incontainer' and
3096     \ @{$node->{<Q::pc:childNodes>}} == 1) {
3097     $r .= '(' . $cn->stringify . ')';
3098     } else {
3099     $r .= $cn->stringify;
3100     }
3101     }
3102     __DEEP{
3103     my $file = $self-><AG::ManakaiPerlCodeFragment.fileNode>;
3104     $r = sprintf (qq<\n#line %d "%s (Chunk #%d)"\n>,
3105 wakaba 1.10 $node->{<Q::pc:sourceLine>} || 1,
3106     $node->{<Q::pc:sourceFile>} ||
3107     $file-><AG::ManakaiPerlFile.sourceFile>,
3108 wakaba 1.9 $file-><M::ManakaiPerlFile.getNextChunkNumber>)
3109     . $r
3110     . sprintf (qq<\n#line 1 "%s (Chunk #%d)"\n>,
3111     $file-><AG::ManakaiPerlFile.sourceFile>,
3112     $file-><M::ManakaiPerlFile.getNextChunkNumber>);
3113     }__;
3114     }
3115    
3116     ##PerlBlockContainer
3117    
3118 wakaba 1.11 ClsDef:
3119     @ClsQName: ManakaiPerlAssignment
3120     @ClsISA: ManakaiPerlCodeFragment
3121     @enDesc:
3122     Perl variable assignment.
3123    
3124     @IntMethod:
3125     @@Name:newObject
3126     @@ManakaiDOM:isStatic:1
3127     @@Description:
3128     @@@lang:en
3129     @@@@:
3130     Creates a new instance object for
3131     <Class::ManakaiPerlAssignment>.
3132     @@Return:
3133     @@@Type:
3134     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
3135     @@@Description:
3136     @@@@lang:en
3137     @@@@@:
3138     The newly created node object.
3139     @@@PerlDef:
3140     @@@@@:
3141     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
3142     ::ManakaiDOM:Perl.new>;
3143     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
3144     push @{$node->{<Q::TreeCore:subnode0>}}, <Q::pc:left>, <Q::pc:right>;
3145     $node->{<Q::pc:nodeType>} = 'assign';
3146     @@@@ImplNote:
3147     @@@@@lang:en
3148     @@@@@@:
3149     Properties: <Q::pc:nodeType>, <Q::pc:left>, <Q::pc:right>,
3150 wakaba 1.14 <Q::pc:parent>, <Q::pc:useModuleName>,
3151     <Q::pc:requireResourceURI>.
3152 wakaba 1.11
3153     @IntCloneMethod:
3154     @@Return:
3155     @@@Type:
3156     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
3157     @@@PerlDef:
3158     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
3159     ::ManakaiDOM:Perl.new>;
3160     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
3161     push @{$node->{<Q::TreeCore:subnode0>}}, <Q::pc:left>, <Q::pc:right>;
3162     $node->{<Q::pc:nodeType>} = 'assign';
3163     for my $prop (<Q::pc:left>, <Q::pc:right>) {
3164     my $pack;
3165     my $cno = $nodeObject->{$prop};
3166     my $nt = $cno->{<Q::pc:nodeType>};
3167     __CODE{pc:nodeTypeToPackageName::
3168     $nodeType => $nt, $packageName => $pack, $object => $cno}__;
3169     ## NOTE: Method name written directly
3170     my $cno_clone = $pack->_make_clone_object ($cno);
3171     $node->{$prop} = $cno_clone;
3172     $cno_clone->{<Q::pc:parent>} = $node;
3173     ## NOTE: Tree ID is not updated yet.
3174     }
3175 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
3176     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
3177     $node->{<Q::pc:useModuleName>}
3178     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
3179 wakaba 1.11
3180     @ToStringMethod:
3181     @@Return:
3182     @@@Type:
3183 wakaba 1.12 DISLang:String::ManakaiDOM:all
3184 wakaba 1.11 @@@enDesc:
3185     Perl code.
3186     @@@PerlDef:
3187     my $node = $self->{<Q::TreeCore:node>};
3188     $r = <ClassM::ManakaiPerlCodeFragment.getNodeReference>
3189     ($node->{<Q::pc:left>})->stringify . ' = ' .
3190     <ClassM::ManakaiPerlCodeFragment.getNodeReference>
3191     ($node->{<Q::pc:right>})->stringify;
3192     ##PerlAssignment
3193    
3194 wakaba 1.12 ClsDef:
3195     @ClsQName: ManakaiPerlIf
3196     @ClsISA: ManakaiPerlCodeFragment
3197     @enDesc:
3198     Perl variable assignment.
3199    
3200     @IntMethod:
3201     @@Name:newObject
3202     @@ManakaiDOM:isStatic:1
3203     @@Description:
3204     @@@lang:en
3205     @@@@:
3206     Creates a new instance object for
3207     <Class::ManakaiPerlAssignment>.
3208     @@Return:
3209     @@@Type:
3210     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
3211     @@@Description:
3212     @@@@lang:en
3213     @@@@@:
3214     The newly created node object.
3215     @@@PerlDef:
3216     @@@@@:
3217     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
3218     ::ManakaiDOM:Perl.new>;
3219     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
3220     push @{$node->{<Q::TreeCore:subnode0>}}, <Q::pc:condition>,
3221     <Q::pc:true>, <Q::pc:false>;
3222     $node->{<Q::pc:nodeType>} = 'if';
3223     @@@@ImplNote:
3224     @@@@@lang:en
3225     @@@@@@:
3226     Properties: <Q::pc:nodeType>, <Q::pc:true>, <Q::pc:false>,
3227 wakaba 1.14 <Q::pc:parent>, <Q::pc:condition>, <Q::pc:useModuleName>,
3228     <Q::pc:requireResourceURI>.
3229 wakaba 1.12
3230     @IntCloneMethod:
3231     @@Return:
3232     @@@Type:
3233     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
3234     @@@PerlDef:
3235     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
3236     ::ManakaiDOM:Perl.new>;
3237     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
3238     push @{$node->{<Q::TreeCore:subnode0>}}, <Q::pc:condition>,
3239     <Q::pc:true>, <Q::pc:false>;
3240     $node->{<Q::pc:nodeType>} = 'if';
3241     for my $prop (<Q::pc:true>, <Q::pc:false>, <Q::pc:condition>) {
3242     my $pack;
3243     my $cno = $nodeObject->{$prop};
3244     next unless $cno;
3245     my $nt = $cno->{<Q::pc:nodeType>};
3246     __CODE{pc:nodeTypeToPackageName::
3247     $nodeType => $nt, $packageName => $pack, $object => $cno}__;
3248     ## NOTE: Method name written directly
3249     my $cno_clone = $pack->_make_clone_object ($cno);
3250     $node->{$prop} = $cno_clone;
3251     $cno_clone->{<Q::pc:parent>} = $node;
3252     ## NOTE: Tree ID is not updated yet.
3253     }
3254 wakaba 1.14 $node->{<Q::pc:requireResourceURI>}
3255     = {%{$nodeObject->{<Q::pc:requireResourceURI>} || {}}};
3256     $node->{<Q::pc:useModuleName>}
3257     = {%{$nodeObject->{<Q::pc:useModuleName>} || {}}};
3258 wakaba 1.12
3259     @ToStringMethod:
3260     @@Return:
3261     @@@Type:
3262     DISLang:String::ManakaiDOM:all
3263     @@@enDesc:
3264     Perl code.
3265     @@@PerlDef:
3266     my $node = $self->{<Q::TreeCore:node>};
3267     $r = <ClassM::ManakaiPerlCodeFragment.getNodeReference>
3268     ($node->{<Q::pc:condition>})->stringify;
3269     my $true_code = <ClassM::ManakaiPerlCodeFragment.getNodeReference>
3270     ($node->{<Q::pc:true>})->stringify if $node->{<Q::pc:true>};
3271     my $false_code = <ClassM::ManakaiPerlCodeFragment.getNodeReference>
3272     ($node->{<Q::pc:false>})->stringify if $node->{<Q::pc:false>};
3273     if (defined $true_code) {
3274     if (defined $false_code) {
3275     $r = q<if (> . $r . q<) {> . $true_code .
3276     q<} else {> . $false_code . q<}>;
3277     } else {
3278     $r = q<if (> . $r . q<) {> . $true_code . q<}>;
3279     }
3280     } else {
3281     $r = q<unless (> . $r . q<) {> . $false_code . q<}>;
3282     }
3283     ##PerlIf
3284    
3285     PropDef:
3286     @QName:condition
3287     @enDesc:
3288     Condition.
3289     PropDef:
3290     @QName:true
3291     @enDesc:
3292     If true.
3293     PropDef:
3294     @QName:false
3295     @enDesc:
3296     If false.
3297    
3298 wakaba 1.11 PropDef:
3299     @QName:left
3300     @FullName:
3301     @@lang:en
3302     @@@: Left hand side
3303     PropDef:
3304     @QName:right
3305     @FullName:
3306     @@lang:en
3307     @@@: Right hand side
3308    
3309 wakaba 1.8 PropDef:
3310     @QName:label
3311     @enDesc:
3312     Perl statement / block label.
3313    
3314 wakaba 1.6 ElementTypeBinding:
3315     @Name: RaiseException
3316     @ElementType:
3317     ManakaiDOM:raises
3318    
3319     ClsDef:
3320     @ClsQName: ManakaiPerlCodeImplementation
3321 wakaba 1.1 @enDesc:
3322     The class that provides factory methods.
3323    
3324     @Role:
3325     @@@:
3326     DOMCore:DOMImplementation::ManakaiDOM:ManakaiDOM
3327     @@compat:
3328     DOMCore:ManakaiDOMImplementation::ManakaiDOM:ManakaiDOMLatest
3329    
3330     @Method:
3331     @@Name: createPerlFile
3332     @@enDesc:
3333     Creates a Perl code file.
3334     @@Return:
3335     @@@Type: ManakaiPerlFile
3336     @@@enDesc: A newly created Perl source file object.
3337     @@@PerlDef:
3338     $r = <ClassM::ManakaiPerlFile.newObject>;
3339 wakaba 1.6 __CODE{ManakaiNode:getNewReference::
3340     $object => $r, $ref => $r,
3341     $class => {<ClassName::ManakaiPerlFile>}}__;
3342 wakaba 1.1
3343 wakaba 1.13 @Method:
3344     @@Name: createPerlPackage
3345     @@enDesc:
3346     Creates a new package scope block.
3347     @@Param:
3348     @@@Name: packageName
3349     @@@Type:
3350     Perl:package-name::ManakaiDOM:all
3351     @@@enDesc:
3352     The fully-qualified name of the package to create.
3353     @@Return:
3354     @@@Type: ManakaiPerlPackageScope
3355     @@@enDesc:
3356     The newly created package scope object.
3357     @@@PerlDef:
3358     $r = <ClassM::ManakaiPerlPackageScope.newObject>;
3359     $r->{<Q::pc:packageName>} = $packageName;
3360     __CODE{ManakaiNode:getNewReference::
3361     $object => $r, $ref => $r,
3362     $class => {<ClassName::ManakaiPerlPackageScope>}}__;
3363    
3364 wakaba 1.1 @IntMethod:
3365     @@Name: perlComment
3366     @@ManakaiDOM:isStatic:1
3367     @@enDesc:
3368     Generates a Perl comment string.
3369     @@Param:
3370     @@@Name: str
3371     @@@Type:
3372 wakaba 1.12 DISLang:String::ManakaiDOM:all
3373 wakaba 1.1 @@@enDesc:
3374     A comment text.
3375     @@Return:
3376     @@@Type:
3377 wakaba 1.12 DISLang:String::ManakaiDOM:all
3378 wakaba 1.1 @@@enDesc:
3379     A Perl comment string.
3380     @@@PerlDef:
3381     $r = $str;
3382     $r =~ s/\n/\n## /g;
3383     $r =~ s/\n## $/\n/s;
3384     $r .= "\n" unless $r =~ /\n$/;
3385     $r = q<## > . $r;
3386    
3387     @IntMethod:
3388     @@Name: rfc3339DateTime
3389     @@ManakaiDOM:isStatic:1
3390     @@enDesc:
3391     Returns RFC 3339 <CODE::date-time> representation of a date.
3392     @@Param:
3393     @@@Name: perlDate
3394     @@@Type:
3395 wakaba 1.12 DOMMain:unsigned-long::ManakaiDOM:all
3396 wakaba 1.1 @@@enDesc:
3397     A Perl representation of date.
3398     @@Return:
3399     @@@Type:
3400 wakaba 1.12 DISLang:String::ManakaiDOM:all
3401 wakaba 1.1 @@@enDesc:
3402     RFC 3339 date string.
3403     @@@PerlDef:
3404     my @time = gmtime $perlDate;
3405     $r = sprintf q<%04d-%02d-%02dT%02d:%02d:%02d+00:00>,
3406     $time[5] + 1900, $time[4] + 1, @time[3,2,1,0];
3407    
3408     @IntMethod:
3409     @@Name: versionDateTime
3410     @@ManakaiDOM:isStatic:1
3411     @@enDesc:
3412     Returns date for version.
3413     @@Param:
3414     @@@Name: perlDate
3415     @@@Type:
3416 wakaba 1.12 DOMMain:unsigned-long::ManakaiDOM:all
3417 wakaba 1.1 @@@enDesc:
3418     A Perl representation of date.
3419     @@Return:
3420     @@@Type:
3421 wakaba 1.12 DISLang:String::ManakaiDOM:all
3422 wakaba 1.1 @@@enDesc:
3423     A Perl number literal.
3424     @@@PerlDef:
3425     my @time = gmtime $perlDate;
3426     $r = sprintf q<%04d%02d%02d.%02d%02d>,
3427     $time[5] + 1900, $time[4] + 1, @time[3,2,1];
3428    
3429     @Method:
3430     @@Name: perlLiteral
3431     @@enDesc:
3432     Perl code representation.
3433     @@Param:
3434     @@@Name: val
3435     @@@Type:
3436 wakaba 1.12 DOMMain:any::ManakaiDOM:all
3437 wakaba 1.1 @@@enDesc:
3438     A Perl value.
3439     @@Return:
3440     @@@Type:
3441 wakaba 1.12 DISLang:String::ManakaiDOM:all
3442 wakaba 1.1 @@@enDesc:
3443     A Perl lexical representation of <P::val>.
3444     @@@PerlDef:
3445     unless (defined $val) {
3446     $r = q<undef>;
3447     } elsif (ref $val eq 'ARRAY') {
3448     __DEEP{
3449     $r = q<[> . <ClassM::ManakaiPerlCodeImplementation
3450 wakaba 1.14 .perlList> ($val) . q<]>;
3451 wakaba 1.1 }__;
3452     } elsif (ref $val eq 'HASH') {
3453     __DEEP{
3454     $r = q<{> . <ClassM::ManakaiPerlCodeImplementation
3455 wakaba 1.14 .perlList> ([%$val]) . q<}>;
3456 wakaba 1.1 }__;
3457     } else {
3458     $val =~ s/(['\\])/\\$1/g;
3459     $r = q<'> . $val . q<'>;
3460     }
3461    
3462     @Method:
3463     @@Name: perlList
3464     @@enDesc:
3465     Perl code representation of a list.
3466     @@Param:
3467     @@@Name: val
3468     @@@Type:
3469 wakaba 1.12 Perl:ARRAY::ManakaiDOM:all
3470 wakaba 1.1 @@@enDesc:
3471     A Perl array reference.
3472     @@Return:
3473     @@@Type:
3474 wakaba 1.12 DISLang:String::ManakaiDOM:all
3475 wakaba 1.1 @@@enDesc:
3476     A Perl lexical representation of <CODE::@$val>.
3477     @@@PerlDef:
3478     __DEEP{
3479     $r = join (q<, >, map {<ClassM::ManakaiPerlCodeImplementation
3480     .perlLiteral> ($_)} @{$val});
3481     }__;
3482 wakaba 1.5
3483     @Method:
3484     @@Name: createPerlSub
3485     @@enDesc:
3486     Creates a new <Class::ManakaiPerlSub> object.
3487     @@Param:
3488     @@@Name: subName
3489     @@@Type:
3490 wakaba 1.12 DISLang:String::ManakaiDOM:all
3491 wakaba 1.5 @@@enDesc:
3492     The name of the subroutine to create.
3493     @@@nullCase:
3494     @@@@enDesc:
3495     The subroutine created has no name.
3496     @@Return:
3497     @@@Type:ManakaiPerlSub
3498     @@@enDesc:
3499     Newly created Perl subroutine object.
3500     @@@PerlDef:
3501     __DEEP{
3502 wakaba 1.6 $r = <ClassM::ManakaiPerlSub.newObject>;
3503     __CODE{ManakaiNode:getNewReference::
3504     $object => $r, $ref => $r,
3505     $class => {<ClassName::ManakaiPerlSub>}}__;
3506     $r-><AS::ManakaiPerlSub.localName> ($subName) if defined $subName;
3507 wakaba 1.5 }__;
3508    
3509     @Method:
3510     @@Name: createPerlUnparsedCode
3511     @@enDesc:
3512     Creates a new <Class::ManakaiPerlUnparsedCode> object.
3513     @@Param:
3514     @@@Name: codeArg
3515     @@@Type:
3516     lang:Perl::ManakaiDOM:all
3517     @@@enDesc:
3518     The code fragment.
3519     @@@nullCase:
3520     @@@@enDesc:
3521     The fragment initially has no code.
3522     @@Return:
3523     @@@Type:ManakaiPerlUnparsedCode
3524     @@@enDesc:
3525     Newly created Perl code object.
3526     @@@PerlDef:
3527     __DEEP{
3528 wakaba 1.6 $r = <ClassM::ManakaiPerlUnparsedCode.newObject>;
3529     __CODE{ManakaiNode:getNewReference::
3530     $object => $r, $ref => $r,
3531     $class => {<ClassName::ManakaiPerlUnparsedCode>}}__;
3532 wakaba 1.7 $r-><AS::ManakaiPerlUnparsedCode.code> ($codeArg) if defined $codeArg;
3533 wakaba 1.6 }__;
3534    
3535     @Method:
3536     @@Name: createPerlInlineContainer
3537     @@enDesc:
3538     Creates a new <Class::ManakaiPerlInlineContainer> object.
3539     @@Return:
3540     @@@Type:ManakaiPerlInlineContainer
3541     @@@enDesc:
3542     Newly created Perl code object.
3543     @@@PerlDef:
3544     __DEEP{
3545     $r = <ClassM::ManakaiPerlInlineContainer.newObject>;
3546     __CODE{ManakaiNode:getNewReference::
3547     $object => $r, $ref => $r,
3548     $class => {<ClassName::ManakaiPerlInlineContainer>}}__;
3549     }__;
3550    
3551     @Method:
3552     @@Name: createPerlInlineUnparsedCode
3553     @@enDesc:
3554     Creates a new <Class::ManakaiPerlInlineUnparsedCode> object.
3555     @@Param:
3556     @@@Name: codeArg
3557     @@@Type:
3558     lang:Perl::ManakaiDOM:all
3559     @@@enDesc:
3560     The code fragment.
3561     @@@nullCase:
3562     @@@@enDesc:
3563     The fragment initially has no code.
3564     @@Return:
3565     @@@Type:ManakaiPerlInlineUnparsedCode
3566     @@@enDesc:
3567     Newly created Perl code object.
3568     @@@PerlDef:
3569     __DEEP{
3570     $r = <ClassM::ManakaiPerlInlineUnparsedCode.newObject>;
3571     __CODE{ManakaiNode:getNewReference::
3572     $object => $r, $ref => $r,
3573     $class => {<ClassName::ManakaiPerlInlineUnparsedCode>}}__;
3574 wakaba 1.7 $r-><AS::ManakaiPerlInlineUnparsedCode.code> ($codeArg)
3575 wakaba 1.6 if defined $codeArg;
3576     }__;
3577    
3578     @Method:
3579     @@Name: createPerlBare
3580     @@enDesc:
3581     Creates a new <Class::ManakaiPerlBare> object.
3582     @@Param:
3583     @@@Name: codeArg
3584     @@@Type:
3585     lang:Perl::ManakaiDOM:all
3586     @@@enDesc:
3587     The code fragment.
3588     @@Return:
3589     @@@Type:ManakaiPerlBare
3590     @@@enDesc:
3591     Newly created Perl code object.
3592     @@@PerlDef:
3593     __DEEP{
3594     $r = <ClassM::ManakaiPerlBare.newObject>;
3595     __CODE{ManakaiNode:getNewReference::
3596     $object => $r, $ref => $r,
3597     $class => {<ClassName::ManakaiPerlBare>}}__;
3598 wakaba 1.7 $r-><AS::ManakaiPerlBare.code> ($codeArg);
3599 wakaba 1.6 }__;
3600    
3601     @Method:
3602     @@Name: createPerlAtom
3603     @@enDesc:
3604     Creates a new <Class::ManakaiPerlAtom> object.
3605     @@Param:
3606     @@@Name: codeArg
3607     @@@Type:
3608     lang:Perl::ManakaiDOM:all
3609     @@@enDesc:
3610     The code fragment.
3611     @@Return:
3612     @@@Type:ManakaiPerlAtom
3613     @@@enDesc:
3614     Newly created Perl code object.
3615     @@@PerlDef:
3616     __DEEP{
3617     $r = <ClassM::ManakaiPerlAtom.newObject>;
3618     __CODE{ManakaiNode:getNewReference::
3619     $object => $r, $ref => $r,
3620     $class => {<ClassName::ManakaiPerlAtom>}}__;
3621 wakaba 1.7 $r-><AS::ManakaiPerlBare.code> ($codeArg);
3622 wakaba 1.6 }__;
3623    
3624     @Method:
3625     @@Name: createPerlStringLiteral
3626     @@enDesc:
3627     Creates a new <Class::ManakaiPerlStringLiteral> object.
3628     @@Param:
3629     @@@Name: stringArg
3630     @@@Type:
3631     DISLang:String::ManakaiDOM:all
3632     @@@enDesc: A string.
3633     @@Return:
3634     @@@Type:ManakaiPerlStringLiteral
3635     @@@enDesc:
3636     Newly created Perl code object.
3637     @@@PerlDef:
3638     __DEEP{
3639     $r = <ClassM::ManakaiPerlStringLiteral.newObject>;
3640     __CODE{ManakaiNode:getNewReference::
3641     $object => $r, $ref => $r,
3642     $class => {<ClassName::ManakaiPerlStringLiteral>}}__;
3643 wakaba 1.7 $r-><AS::ManakaiPerlStringLiteral.data> ($stringArg);
3644 wakaba 1.6 }__;
3645    
3646     @Method:
3647     @@Name: createPerlVariable
3648     @@enDesc:
3649     Creates a new <Class::ManakaiPerlVariable> object.
3650     @@Param:
3651     @@@Name: variableType
3652     @@@Type:
3653     DISLang:String::ManakaiDOM:all
3654     @@@enDesc:
3655     Variable prefix.
3656 wakaba 1.16 @@@nullCase:
3657     @@@@enDesc:
3658     If the <P::packageName> is <DOM::null>, then
3659     the <P::variableType> is detected by the prefix of
3660     <P::localName>. Otherwise, it is an unprefixed variable
3661     such as file handle.
3662 wakaba 1.6 @@Param:
3663     @@@Name: packageName
3664     @@@Type:
3665     Perl:package-name::ManakaiDOM:all
3666     @@@enDesc:
3667     Package name.
3668     @@@nullCase:
3669     @@@@enDesc:
3670     The variable belongs to the current package or a
3671     lexical-scoped variable.
3672     @@Param:
3673     @@@Name: localName
3674     @@@Type:
3675     DISLang:String::ManakaiDOM:all
3676     @@@enDesc:
3677 wakaba 1.16 Variable name. If both <P::variableType> and <P::packageName>
3678     is <DOM::null>, the <P::localName> value may be prefixed
3679     by any possible <P::variableType> value.
3680 wakaba 1.6 @@Return:
3681     @@@Type:ManakaiPerlVariable
3682     @@@enDesc:
3683     Newly created Perl variable object.
3684     @@@PerlDef:
3685     __DEEP{
3686     $r = <ClassM::ManakaiPerlVariable.newObject>;
3687     __CODE{ManakaiNode:getNewReference::
3688     $object => $r, $ref => $r,
3689     $class => {<ClassName::ManakaiPerlVariable>}}__;
3690 wakaba 1.16 if (not $variableType and not $packageName and
3691     $localName =~ s/^(\\?[\$\@%&*])//) {
3692     $variableType = $1;
3693     }
3694 wakaba 1.7 $r-><AS::ManakaiPerlVariable.variableType> ($variableType);
3695     $r-><AS::ManakaiPerlVariable.packageName> ($packageName);
3696     $r-><AS::ManakaiPerlVariable.localName> ($localName);
3697 wakaba 1.8 }__;
3698    
3699     @Method:
3700     @@Name: createPerlBlock
3701     @@enDesc:
3702     Creates a new <Class::ManakaiPerlBlock> object.
3703     @@Return:
3704     @@@Type:ManakaiPerlBlock
3705     @@@enDesc:
3706     Newly created Perl code object.
3707     @@@PerlDef:
3708     __DEEP{
3709     $r = <ClassM::ManakaiPerlBlock.newObject>;
3710     __CODE{ManakaiNode:getNewReference::
3711     $object => $r, $ref => $r,
3712     $class => {<ClassName::ManakaiPerlBlock>}}__;
3713 wakaba 1.5 }__;
3714 wakaba 1.9
3715     @Method:
3716     @@Name: createPerlBlockContainer
3717     @@enDesc:
3718     Creates a new <Class::ManakaiPerlBlockContainer> object.
3719     @@Return:
3720     @@@Type:ManakaiPerlBlockContainer
3721     @@@enDesc:
3722     Newly created Perl code object.
3723     @@@PerlDef:
3724     __DEEP{
3725     $r = <ClassM::ManakaiPerlBlockContainer.newObject>;
3726     __CODE{ManakaiNode:getNewReference::
3727     $object => $r, $ref => $r,
3728     $class => {<ClassName::ManakaiPerlBlockContainer>}}__;
3729     }__;
3730 wakaba 1.11
3731     @Method:
3732     @@Name: createPerlStatement
3733     @@enDesc:
3734     Creates a new Perl statement.
3735     @@Param:
3736     @@@Name: codeArg
3737     @@@Type:
3738     lang:Perl::ManakaiDOM:all
3739     @@@enDesc:
3740     A Perl statement without terminating <Perl::;>.
3741     @@@nullCase:
3742     @@@@enDesc:
3743     No initial content.
3744     @@Return:
3745     @@@Type: ManakaiPerlStatement
3746     @@@enDesc:
3747     The newly created Perl code object.
3748     @@@PerlDef:
3749     $r = <ClassM::ManakaiPerlStatement.newObject>;
3750     __CODE{ManakaiNode:getNewReference::
3751     $object => $r, $ref => $r,
3752     $class =>{<ClassName::ManakaiPerlStatement>},
3753     }__;
3754     if (defined $codeArg) {
3755     __DEEP{
3756     $r-><M::ManakaiPerlAnyContainer.appendBare> ($codeArg);
3757     }__;
3758     }
3759 wakaba 1.12
3760     @Method:
3761     @@Name: createPerlIf
3762     @@enDesc:
3763     Creates a <Class::ManakaiPerlIf> object.
3764     @@Param:
3765     @@@Name: conditionArg
3766     @@@Type: ManakaiPerlCodeFragment
3767     @@@enDesc:
3768     Conditoon code fragment object.
3769     @@Param:
3770     @@@Name: trueArg
3771     @@@Type: ManakaiPerlCodeFragment
3772     @@@enDesc:
3773     A true code fragment object.
3774     @@@nullCase:
3775     @@@@enDesc: No true code.
3776     @@Param:
3777     @@@Name: falseArg
3778     @@@Type: ManakaiPerlCodeFragment
3779     @@@enDesc:
3780     A false code fragment object.
3781     @@@nullCase:
3782     @@@@enDesc: No false code.
3783     @@Return:
3784     @@@RaiseException:
3785     @@@@@:BAD_CHILD_ERR
3786     @@@@enDesc:
3787     An attempt is made to append a child
3788     that is not valid type.
3789     @@@RaiseException:
3790     @@@@@:IN_USE_NODE_ERR
3791     @@@@enDesc:
3792     An attempt is made to append a node that is
3793     already used elsewhere.
3794     @@@PerlDef:
3795     for my $arg ([conditionArg => $conditionArg]) {
3796     if ({
3797     atom => 1, bare => 1, incontainer => 1, assign => true,
3798     inunparsed => 1, variable => 1, string => true,
3799     }->{$arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:nodeType>}}) {
3800     if ($arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
3801     __EXCEPTION{IN_USE_NODE_ERR::
3802     pc:childNode => {$arg->[1]},
3803     MDOMX:param-name => {$arg->[0]},
3804     }__;
3805     }
3806     } else {
3807     __EXCEPTION{BAD_CHILD_ERR::
3808     pc:parentNode => {$self},
3809     pc:childNode => {$arg->[1]},
3810     MDOMX:param-name => {$arg->[0]},
3811     }__;
3812     }
3813     } # c
3814    
3815     for my $arg ([trueArg => $trueArg],
3816     [falseArg => $falseArg]) {
3817     next unless $arg->[1];
3818     if ({
3819     blockcontainer => true,
3820     }->{$arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:nodeType>}}) {
3821     if ($arg->[1]->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
3822     __EXCEPTION{IN_USE_NODE_ERR::
3823     pc:childNode => {$arg->[1]},
3824     MDOMX:param-name => {$arg->[0]},
3825     }__;
3826     }
3827     } else {
3828     __EXCEPTION{BAD_CHILD_ERR::
3829     pc:parentNode => {$self},
3830     pc:childNode => {$arg->[1]},
3831     MDOMX:param-name => {$arg->[0]},
3832     }__;
3833     }
3834     } # t/f
3835    
3836     my $assign = <ClassM::ManakaiPerlIf.newObject>;
3837     $assign->{<Q::pc:condition>} = $conditionArg->{<Q::TreeCore:node>};
3838     $assign->{<Q::pc:true>} = $trueArg->{<Q::TreeCore:node>} if $trueArg;
3839     $assign->{<Q::pc:false>} = $falseArg->{<Q::TreeCore:node>} if $falseArg;
3840     $assign->{<Q::TreeCore:node>}-><M::MNodeObject.importTree> ($_)
3841     for (grep {$_}
3842     $assign->{<Q::pc:condition>}, $assign->{<Q::pc:true>},
3843     $assign->{<Q::pc:false>});
3844     $conditionArg->{<Q::TreeCore:node>}->{<Q::pc:parent>} = $assign;
3845     $trueArg->{<Q::TreeCore:node>}->{<Q::pc:parent>} = $assign if $trueArg;
3846     $falseArg->{<Q::TreeCore:node>}->{<Q::pc:parent>} = $assign if $falseArg;
3847 wakaba 1.1 ##PerlCodeImplementation
3848    
3849 wakaba 1.5 ResourceDef:
3850     @QName: MNodeObject
3851     @rdf:type:
3852     ManakaiDOM:Class
3853     @AliasFor:
3854     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
3855    
3856 wakaba 1.1 PropDef:
3857     @QName: code
3858     @enDesc: Perl code.
3859    
3860     PropDef:
3861     @QName: sourceFile
3862     @enDesc:
3863     Source file.
3864    
3865     PropDef:
3866     @QName: sourceLine
3867     @enDesc:
3868     Source line number.
3869 wakaba 1.10
3870     PropDef:
3871     @QName: currentSourceFile
3872     @enDesc:
3873     <QUOTE::Current> source file.
3874    
3875     PropDef:
3876     @QName: currentSourceLine
3877     @enDesc:
3878     <QUOTE::Current> source line number.
3879 wakaba 1.1
3880     PropDef:
3881     @QName: prototype
3882     @enDesc:
3883     Prototype of subroutine.
3884    
3885     PropDef:
3886     @QName: parent
3887     @enDesc:
3888     Higher-level object.
3889    
3890     PropDef:
3891     @QName: sub
3892     @enDesc:
3893     Perl subroutines.
3894    
3895     PropDef:
3896     @QName: packageName
3897     @Type:
3898 wakaba 1.12 Perl:package-name::ManakaiDOM:all
3899 wakaba 1.1 @enDesc:
3900     The fully qualified names of packages.
3901    
3902     PropDef:
3903     @QName: childNodes
3904     @enDesc:
3905     Child code fragments.
3906    
3907     PropDef:
3908     @QName: localName
3909     @enDesc:
3910     Scoped names.
3911 wakaba 1.4
3912     ## -- Exceptions
3913    
3914     ExceptionDef:
3915     @ClsQName: ManakaiPerlCodeException
3916     @enDesc:
3917     Exceptions for the <Module::PerlCode> module.
3918     @ClsISA:
3919     ManakaiDOM:ManakaiDOMException::ManakaiDOM:Perl
3920     @XConstGroupDef:
3921     @@ClsQName: ManakaiPerlCodeExceptionCode
3922     @@enDesc:
3923     Exception codes for <Class::ManakaiPerlCodeException>.
3924 wakaba 1.5 @@XConstDef:
3925     @@@Name: HIERARCHY_REQUEST_ERR
3926     @@@Value:3
3927     @@@enDesc:
3928     An attempt is made to break the hierarchy.
3929     @@@XSubTypeDef:
3930     @@@@QName: BAD_CHILD_ERR
3931     @@@@enDesc:
3932     An attempt is made to append a node as a child whose type
3933     is not allowed.
3934     @@@@XParam:
3935     @@@@@QName: childNode
3936     @@@@@enDesc:
3937     The node attempted to append.
3938     @@@@XParam:
3939     @@@@@QName: parentNode
3940     @@@@@enDesc:
3941     The node to whose child list an attempt to append is made.
3942     @@@XSubTypeDef:
3943     @@@@QName: IN_USE_NODE_ERR
3944     @@@@enDesc:
3945     An attempt is made to append a node that has already been used
3946     elsewhere.
3947     @@@@XParam:
3948     @@@@@QName: childNode
3949     @@@@@enDesc:
3950     The node attempted to append.
3951     @@@@XParam:
3952     @@@@@QName: parentNode
3953     @@@@@enDesc:
3954     The parent node of the <XP::childNode>.
3955 wakaba 1.4 @@XConstDef:
3956     @@@Name: NOT_SUPPORTED_ERR
3957     @@@Value:9
3958     @@@enDesc:
3959     An attempt is made to do something the implementation does not support.
3960     @@@XSubTypeDef:
3961     @@@@QName: UNSUPPORTED_OPERATOR_ERR
3962     @@@@enDesc:
3963     The implementation does not support the specified operator.
3964     @@@@XParam:
3965     @@@@@QName: operator
3966     @@@@@enDesc:
3967     The operator that is not supported.
3968     @@@@enMufDef:
3969     Operator "%p (name => {<Q::pc:operator>});" is not supported
3970    
3971     ElementTypeBinding:
3972     @Name: ExceptionDef
3973     @ElementType:
3974     dis:ResourceDef
3975     @ShadowContent:
3976     @@rdf:type:
3977     ManakaiDOM:ExceptionClass
3978     @@AliasFor:
3979     @@@@:
3980     ::ManakaiDOM:Perl
3981     @@@For:
3982     !=ManakaiDOM:Perl
3983     @@ForCheck:
3984     ManakaiDOM:Perl
3985     @@DOMMain:implementFeature: CoreFeature10
3986    
3987     ElementTypeBinding:
3988     @Name: XConstGroupDef
3989     @ElementType:
3990     dis:ResourceDef
3991     @ShadowContent:
3992     @@rdf:type:
3993     ManakaiDOM:ConstGroup
3994     @@Type:
3995     DOMMain:unsigned-short::ManakaiDOM:all
3996     @@rdfs:subClassOf:
3997     DOMMain:unsigned-short::ManakaiDOM:all
3998    
3999     ElementTypeBinding:
4000     @Name: XConstDef
4001     @ElementType:
4002     dis:ResourceDef
4003     @ShadowContent:
4004     @@rdf:type:
4005     ManakaiDOM:Const
4006    
4007     ElementTypeBinding:
4008     @Name: XSubTypeDef
4009     @ElementType:
4010     dis:ResourceDef
4011     @ShadowContent:
4012     @@rdf:type:
4013     ManakaiDOM:ExceptionOrWarningSubType
4014    
4015     ElementTypeBinding:
4016     @Name: XParam
4017     @ElementType:
4018     ManakaiDOM:exceptionOrWarningParameter
4019    
4020     ElementTypeBinding:
4021     @Name: XParamDef
4022     @ElementType:
4023     dis:ResourceDef
4024     @ShadowContent:
4025     @@rdf:type:
4026     DOMMain:XWParameter
4027     @@AliasFor:
4028     @@@For:
4029     !=ManakaiDOM:all
4030     @@@@:
4031     ::ManakaiDOM:all
4032    
4033     ElementTypeBinding:
4034     @Name: enMufDef
4035     @ElementType:
4036     dis:Def
4037     @ShadowContent:
4038     @@ContentType:
4039     lang:muf
4040     @@lang:en
4041    
4042 wakaba 1.1
4043     ElementTypeBinding:
4044     @Name: ClsDef
4045     @ElementType:
4046     dis:ResourceDef
4047     @ShadowContent:
4048     @@rdf:type:
4049     ManakaiDOM:Class
4050     @@AliasFor:
4051     @@@@:
4052     ::ManakaiDOM:Perl
4053     @@@For:
4054     !=ManakaiDOM:Perl
4055     @@ForCheck:
4056     ManakaiDOM:Perl
4057     @@DOMMain:implementFeature: CoreFeature10
4058    
4059     ElementTypeBinding:
4060     @Name: ClsQName
4061     @ElementType:
4062     dis:QName
4063    
4064     ElementTypeBinding:
4065     @Name: ClsISA
4066     @ElementType:
4067     dis:ISA
4068    
4069     ElementTypeBinding:
4070     @Name: Method
4071     @ElementType:
4072     dis:ResourceDef
4073     @ShadowContent:
4074     @@rdf:type:
4075     DISLang:Method
4076    
4077     ElementTypeBinding:
4078     @Name: ToStringMethod
4079     @ElementType:
4080     dis:ResourceDef
4081     @ShadowContent:
4082     @@rdf:type:
4083     DISLang:Method
4084     @@Operator:
4085     @@@@:
4086     DISPerl:AsStringMethod
4087     @@@ContentType:
4088     dis:TypeQName
4089     @@Description:
4090     @@@lang:en
4091     @@@@:
4092     Returns the textual Perl source code representation of this object.
4093 wakaba 1.9
4094 wakaba 1.14 ElementTypeBinding:
4095     @Name: NumValMethod
4096     @ElementType:
4097     dis:ResourceDef
4098     @ShadowContent:
4099     @@rdf:type:
4100     DISLang:Method
4101     @@Operator:
4102     @@@@: 0+
4103     @@@ContentType:
4104     lang:Perl
4105     @@Description:
4106     @@@lang:en
4107     @@@@:
4108     Returns the numeric value of this object.
4109 wakaba 1.9
4110     ElementTypeBinding:
4111     @Name: IntCloneMethod
4112     @ElementType:
4113     dis:ResourceDef
4114     @ShadowContent:
4115     @@rdf:type:
4116     DISLang:Method
4117     @@Name: makeCloneObject
4118     @@Description:
4119     @@@lang:en
4120     @@@@:
4121     Returns the node object of a deep clone of a node object.
4122     @@ManakaiDOM:isStatic:1
4123     @@ManakaiDOM:isForInternal:1
4124     @@ResourceDef:
4125     @@@rdf:type:
4126     DISLang:MethodParameter
4127     @@@Name: nodeObject
4128     @@@Type:
4129     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
4130     @@@Description:
4131     @@@@lang:en
4132     @@@@@: Node object to copy.
4133     @ShadowSibling:
4134     @@ResourceDef:
4135     @@@rdf:type:
4136     DISLang:Method
4137     @@@Operator:
4138     @@@@@:
4139     DISPerl:CloneMethod
4140     @@@@ContentType:
4141     dis:TypeQName
4142     @@@Description:
4143     @@@@lang:en
4144     @@@@@:
4145     Generates a deep clone of this node and returns it.
4146     @@@ResourceDef:
4147     @@@@rdf:type:
4148     DISLang:MethodReturn
4149     @@@@Type: ManakaiPerlCodeFragment
4150     @@@@Description:
4151     @@@@@lang:en
4152     @@@@@@:
4153     The newly created clone node.
4154     \
4155     {NOTE:: The <A::.parentNode> attribute of the clone
4156     is set to <DOM::null>.
4157     \
4158     }
4159     @@@@Def:
4160     @@@@@ContentType:
4161     lang:Perl
4162     @@@@@@:
4163     ## NOTE: Method name directly written
4164     my $ro = $self->_make_clone_object ($self->{<Q::TreeCore:node>});
4165     $ro-><M::ManakaiDOM:ManakaiDOMNodeObject
4166     ::ManakaiDOM:Perl.changeTreeID>
4167     (<Code::ManakaiDOM:generateUniqueID
4168     ::ManakaiDOM:Perl>);
4169     $r = <ClassM::ManakaiPerlCodeFragment.getNodeReference> ($ro);
4170 wakaba 1.1
4171     ElementTypeBinding:
4172     @Name: IntMethod
4173     @ElementType:
4174     dis:ResourceDef
4175     @ShadowContent:
4176     @@rdf:type:
4177     DISLang:Method
4178     @@ManakaiDOM:isForInternal:1
4179    
4180     ElementTypeBinding:
4181     @Name: Attr
4182     @ElementType:
4183     dis:ResourceDef
4184     @ShadowContent:
4185     @@rdf:type:
4186     DISLang:Attribute
4187    
4188     ElementTypeBinding:
4189     @Name: Return
4190     @ElementType:
4191     dis:ResourceDef
4192     @ShadowContent:
4193     @@rdf:type:
4194     DISLang:MethodReturn
4195    
4196     ElementTypeBinding:
4197     @Name: Get
4198     @ElementType:
4199     dis:ResourceDef
4200     @ShadowContent:
4201     @@rdf:type:
4202     DISLang:AttributeGet
4203    
4204     ElementTypeBinding:
4205     @Name: Set
4206     @ElementType:
4207     dis:ResourceDef
4208     @ShadowContent:
4209     @@rdf:type:
4210     DISLang:AttributeSet
4211    
4212     ElementTypeBinding:
4213     @Name: Param
4214     @ElementType:
4215     dis:ResourceDef
4216     @ShadowContent:
4217     @@rdf:type:
4218     DISLang:MethodParameter
4219    
4220     ElementTypeBinding:
4221     @Name: PerlDef
4222     @ElementType:
4223     dis:Def
4224     @ShadowContent:
4225     @@ContentType:
4226     lang:Perl
4227    
4228     ElementTypeBinding:
4229     @Name: disDef
4230     @ElementType:
4231     dis:Def
4232     @ShadowContent:
4233     @@ContentType:
4234     lang:dis
4235    
4236     ElementTypeBinding:
4237     @Name: InCase
4238     @ElementType:
4239     dis:ResourceDef
4240     @ShadowContent:
4241     @@rdf:type:
4242     ManakaiDOM:InCase
4243    
4244     ElementTypeBinding:
4245     @Name: nullCase
4246     @ElementType:
4247     dis:ResourceDef
4248     @ShadowContent:
4249     @@rdf:type:
4250     ManakaiDOM:InCase
4251     @@Value:
4252     @@@is-null:1
4253    
4254     ElementTypeBinding:
4255     @Name: TrueCase
4256     @ElementType:
4257     dis:ResourceDef
4258     @ShadowContent:
4259     @@rdf:type:
4260     ManakaiDOM:InCase
4261     @@Value:true
4262     @@Type:
4263 wakaba 1.12 DOMMain:boolean::ManakaiDOM:all
4264 wakaba 1.1
4265    
4266     ElementTypeBinding:
4267     @Name: FalseCase
4268     @ElementType:
4269     dis:ResourceDef
4270     @ShadowContent:
4271     @@rdf:type:
4272     ManakaiDOM:InCase
4273     @@Value:false
4274     @@Type:
4275 wakaba 1.12 DOMMain:boolean::ManakaiDOM:all
4276 wakaba 1.1
4277     ElementTypeBinding:
4278     @Name: enDesc
4279     @ElementType:
4280     dis:Description
4281     @ShadowContent:
4282     @@lang:en
4283    
4284     ElementTypeBinding:
4285     @Name: PropDef
4286     @ElementType:
4287     dis:ResourceDef
4288     @ShadowContent:
4289     @@rdf:type:
4290     rdf:Property
4291     @@AliasFor:
4292     @@@@:
4293     ::ManakaiDOM:all
4294     @@@For:
4295     !=ManakaiDOM:all
4296    
4297     ElementTypeBinding:
4298     @Name: NamedParam
4299     @ElementType:
4300     dis:ResourceDef
4301     @ShadowContent:
4302     @@rdf:type:
4303     DISLang:MethodParameter
4304     @@DISPerl:isNamedParameter:1
4305    

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24