/[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.5 - (hide annotations) (download)
Sun Mar 6 11:12:42 2005 UTC (20 years, 4 months ago) by wakaba
Branch: MAIN
Changes since 1.4: +311 -4 lines
lib/Message/Markup/SuikaWikiConfig21.dis: Throws an exception if prefix is not declared; lib/Message/Util/DIS.dis: ManakaiDISResourceDefinition.plCode added (but not completed)

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.5 $Date: 2005/03/05 12:00:44 $
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     $r = $r-><M::ManakaiDOM:ManakaiDOMNodeObject
221     ::ManakaiDOM:Perl.newReference>
222     (<ClassName::ManakaiPerlSub>) if $r;
223     ##PerlCodeFragment
224    
225     ClsDef:
226     @ClsQName: ManakaiPerlFile
227     @ClsISA: ManakaiPerlCodeFragment
228     @enDesc:
229     Perl source code files.
230    
231     @IntMethod:
232     @@Name:newObject
233     @@ManakaiDOM:isStatic:1
234     @@Description:
235     @@@lang:en
236     @@@@:
237     Creates a new instance object for <Class::ManakaiPerlFile>.
238     @@Return:
239     @@@Type:
240     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
241     @@@Description:
242     @@@@lang:en
243     @@@@@:
244     The newly created node object.
245     @@@PerlDef:
246     @@@@@:
247     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
248     ::ManakaiDOM:Perl.new>;
249     push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
250     $node->{<Q::pc:childNodes>} = [];
251     $node->{<Q::pc:sourceFile>} = '';
252     $node->{<Q::pc:sourceModule>} = '';
253     $node->{<Q::pc:sourceFor>} = '';
254     $node->{<Q::pc:currentPackage>} = 'main';
255     $node->{<Q::pc:currentChunk>} = 0;
256     @@@@ImplNote:
257     @@@@@lang:en
258     @@@@@@:
259     Properties: <Q::pc:sourceFile>,
260     <Q::pc:sourceModule>, <Q::pc:sourceFor>, <Q::childNodes>,
261     <Q::pc:currentPackage>, <Q::pc:currentChunk>.
262    
263     @Method:
264     @@Name: appendNewPackage
265     @@enDesc:
266     Appends a new package scope block.
267     @@Param:
268     @@@Name: packageName
269     @@@Type:
270     Perl:package-name::ManakaiDOM:all
271     @@@enDesc:
272     The fully-qualified name of the package to create.
273     @@Return:
274     @@@Type: ManakaiPerlPackageScope
275     @@@enDesc:
276     The newly created package scope object.
277     @@@PerlDef:
278     $r = <ClassM::ManakaiPerlPackageScope.newObject>;
279     $r->{<Q::pc:packageName>} = $packageName;
280     $self->{<Q::TreeCore:node>}
281     -><M::ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
282     .importTree> ($r);
283     push @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}}, $r;
284     $r->{<Q::pc:parent>} = $self->{<Q::TreeCore:node>};
285     $r = $r-><M::ManakaiDOM:ManakaiDOMNodeObject
286     ::ManakaiDOM:Perl.newReference>
287     (<ClassName::ManakaiPerlPackageScope>);
288    
289    
290     @Method:
291     @@Name: getFirstPackage
292     @@enDesc:
293     Gets the first package scope block of a name.
294     @@Param:
295     @@@Name: packageName
296     @@@@Type:
297     Perl:package-name::ManakaiDOM:all
298     @@@@enDesc:
299     The fully-qualified name of the package to get.
300     @@NamedParam:
301     @@@Name: makeNewPackage
302     @@@Type:
303     DOMMain:boolean
304     @@@enDesc:
305     Whether a new package scope object should be created if
306     no package of <P::packageName> found.
307     @@@TrueCase:
308     @@@@enDesc:
309     Makes a new object if not found.
310     @@@FalseCase:
311     @@@@enDesc:
312     Don't make a new object.
313     @@Return:
314     @@@Type: ManakaiPerlPackageScope
315     @@@enDesc:
316     The first package scope object whose name is equal to
317     <P::packageName>.
318     @@@nullCase:
319     @@@@enDesc:
320     There is no <P::packageName> package object and
321     the <P::makeNewPackage> parameter is set to <DOM::false>.
322     @@@PerlDef:
323     for my $cn (@{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}}) {
324     if ($cn->{<Q::pc:packageName>} eq $packageName) {
325     $r = $cn;
326     last;
327     }
328     }
329     if ($r) {
330     $r = $r-><M::ManakaiDOM:ManakaiDOMNodeObject
331     ::ManakaiDOM:Perl.newReference>
332     (<ClassName::ManakaiPerlPackageScope>);
333     } elsif ($makeNewPackage) {
334     __DEEP{
335     $r = $self-><M::ManakaiPerlFile.appendNewPackage> ($packageName);
336     }__;
337     }
338    
339     @Method:
340     @@Name: getLastPackage
341     @@enDesc:
342     Gets the last package scope block of a name.
343     @@Param:
344     @@@Name: packageName
345     @@@@Type:
346     Perl:package-name::ManakaiDOM:all
347     @@@@enDesc:
348     The fully-qualified name of the package to get.
349     @@NamedParam:
350     @@@Name: makeNewPackage
351     @@@Type:
352     DOMMain:boolean
353     @@@enDesc:
354     Whether a new package scope object should be created if
355     no package of <P::packageName> found.
356     @@@TrueCase:
357     @@@@enDesc:
358     Makes a new object if not found.
359     @@@FalseCase:
360     @@@@enDesc:
361     Don't make a new object.
362     @@Return:
363     @@@Type: ManakaiPerlPackageScope
364     @@@enDesc:
365     The last package scope object whose name is equal to
366     <P::packageName>.
367     @@@nullCase:
368     @@@@enDesc:
369     There is no <P::packageName> package object and
370     the <P::makeNewPackage> parameter is set to <DOM::false>.
371     @@@PerlDef:
372     for my $cn (reverse @{$self->{<Q::TreeCore:node>}
373     ->{<Q::pc:childNodes>}}) {
374     if ($cn->{<Q::pc:packageName>} eq $packageName) {
375     $r = $cn;
376     last;
377     }
378     }
379     if ($r) {
380     $r = $r-><M::ManakaiDOM:ManakaiDOMNodeObject
381     ::ManakaiDOM:Perl.newReference>
382     (<ClassName::ManakaiPerlPackageScope>);
383     } elsif ($makeNewPackage) {
384     __DEEP{
385     $r = $self-><M::ManakaiPerlFile.appendNewPackage> ($packageName);
386     }__;
387     }
388    
389     @Attr:
390     @@Name: length
391     @@enDesc:
392     The number of child code fragments.
393     @@Type:
394     DOMMain:unsigned-long
395     @@Get:
396     @@@PerlDef:
397 wakaba 1.4 $r = @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}};
398 wakaba 1.1
399     @Attr:
400     @@Name: sourceFile
401     @@enDesc:
402     The file name of the source file from which this
403     Perl code is primary generated.
404     @@Get:
405     @@@Type:
406     DISLang:String
407     @@@disDef:
408     @@@@GetProp: sourceFile
409     @@Set:
410     @@@Type:
411     DISLang:String
412     @@@disDef:
413     @@@@SetProp: sourceFile
414    
415     @Attr:
416     @@Name: sourceModule
417     @@enDesc:
418     The name URI reference of the source module that this package defines.
419     @@Get:
420     @@@Type:
421     DISLang:String
422     @@@disDef:
423     @@@@GetProp: sourceModule
424     @@Set:
425     @@@Type:
426     DISLang:String
427     @@@disDef:
428     @@@@SetProp: sourceModule
429    
430     @Attr:
431     @@Name: sourceFor
432     @@enDesc:
433     The URI reference of the source module <QUOTE::for> for which this
434     package is.
435     @@Get:
436     @@@Type:
437     DISLang:String
438     @@@disDef:
439     @@@@GetProp: sourceFor
440     @@Set:
441     @@@Type:
442     DISLang:String
443     @@@disDef:
444     @@@@SetProp: sourceFor
445    
446     @ToStringMethod:
447     @@Return:
448     @@@Type:
449     DISLang:String
450     @@@enDesc:
451     The Perl code generated.
452     @@@PerlDef:
453     __DEEP{
454     my $node = $self->{<Q::TreeCore:node>};
455     ## -- Header
456     $r = qq<#!/usr/bin/perl \n>;
457     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
458     (q<This file is automatically generated>);
459     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
460     (q< at >.<ClassM::ManakaiPerlCodeImplementation
461     .rfc3339DateTime> (time).q<,>);
462     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
463     (q< from file ">.$node->{<Q::sourceFile>}.q<",>);
464     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
465     (q[ module <].$node->{<Q::sourceModule>}.q[>,]);
466     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
467     (q[ for <].$node->{<Q::sourceFor>}.q[>.]);
468     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
469     (q<Don't edit by hand!>);
470     $r .= qq<use strict;\n>;
471     $self-><AS::ManakaiPerlFile.currentPackage> ('main');
472     $self-><AS::ManakaiPerlFile.currentChunk> (0);
473    
474     ## -- Packages
475     my $pack = {};
476     for my $sp (@{$node->{<Q::pc:childNodes>}}) {
477     my $spe = $sp-><M::ManakaiDOM:ManakaiDOMNodeObject
478     ::ManakaiDOM:Perl.newReference>
479     (<ClassName::ManakaiPerlPackageScope>);
480     $r .= $spe->stringify;
481     for my $ipack (keys %{$sp->{<Q::dis:Implement>}}) {
482     $pack->{$ipack} ||= true; # not defined
483     }
484     $pack->{$sp->{<Q::pc:packageName>}} = []; # defined
485     }
486    
487     ## -- Enables interface packages
488 wakaba 1.3 my @packs = map {'$' . $_ . '::'}
489     grep {not ref $pack->{$_} and $pack->{$_}}
490     keys %$pack;
491     $r .= q<for (>. join (', ', @packs) . qq<){}\n> if @packs;
492 wakaba 1.1
493     ## -- Footer
494     $r .= <ClassM::ManakaiPerlCodeImplementation.perlComment>
495 wakaba 1.2 (q[License: <].$node->{<Q::dis:License>}.qq[>\n]);
496 wakaba 1.1 $r .= qq<1;\n>;
497     }__;
498    
499     @Attr:
500     @@Name: currentPackage
501     @@enDesc:
502     The current Perl package (used in stringify method).
503     @@Type:
504     Perl:package-name::ManakaiDOM:all
505     @@Get:
506     @@@disDef:
507     @@@@GetProp: currentPackage
508     @@Set:
509     @@@disDef:
510     @@@@SetProp: currentPackage
511    
512     @Attr:
513     @@Name: currentChunk
514     @@enDesc:
515     The current code chunk (used in stringify method).
516     @@Type:
517     DOMMain:unsigned-long::ManakaiDOM:all
518     @@Get:
519     @@@disDef:
520     @@@@GetProp: currentChunk
521     @@Set:
522     @@@disDef:
523     @@@@SetProp: currentChunk
524 wakaba 1.2
525     @Attr:
526     @@Name: licenseURI
527     @@enDesc:
528     The license term URI reference for this code.
529     @@Type:
530     DISLang:String::ManakaiDOM:all
531     @@Get:
532     @@@disDef:
533     @@@@GetProp:
534     dis:License
535     @@Set:
536     @@@disDef:
537     @@@@SetProp:
538     dis:License
539 wakaba 1.1 ##PerlFile
540    
541     PropDef:
542     @QName: sourceModule
543     @enDesc:
544     The soruce module name URI reference.
545    
546     PropDef:
547     @QName: sourceFor
548     @enDesc:
549     The source module <QUOTE::for> URI reference.
550    
551     PropDef:
552     @QName: currentPackage
553     @enDesc:
554     The current Perl package name (used for stringify).
555    
556     PropDef:
557     @QName: currentChunk
558     @enDesc:
559     The current code chunk (used for stringify).
560    
561     ClsDef:
562     @ClsQName: ManakaiPerlPackageScope
563     @ClsISA: ManakaiPerlCodeFragment
564    
565     @Attr:
566     @@Name: packageName
567     @@Type:
568     Perl:package-name
569     @@enDesc:
570     The fully-qualified package name.
571     @@Get:
572     @@@disDef:
573     @@@@GetProp: packageName
574    
575     @IntMethod:
576     @@Name:newObject
577     @@ManakaiDOM:isStatic:1
578     @@Description:
579     @@@lang:en
580     @@@@:
581     Creates a new instance object for <Class::ManakaiPerlPackageScope>.
582     @@Return:
583     @@@Type:
584     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
585     @@@Description:
586     @@@@lang:en
587     @@@@@:
588     The newly created node object.
589     @@@PerlDef:
590     @@@@@:
591     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
592     ::ManakaiDOM:Perl.new>;
593 wakaba 1.4 push @{$node->{<Q::TreeCore:subnode2>}}, <Q::pc:sub>,
594     <Q::dis2pm:overload>;
595 wakaba 1.1 push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
596     $node->{<Q::pc:sub>} = {};
597     $node->{<Q::dis:ISA>} = [];
598     $node->{<Q::dis:Implement>} = {};
599 wakaba 1.4 $node->{<Q::dis2pm:overload>} = {};
600 wakaba 1.1
601     @Method:
602     @@Name: getSub
603     @@enDesc:
604     Gets a subroutine.
605     @@Param:
606     @@@Name: subName
607     @@@Type:
608     DISPerl:SubName::ManakaiDOM:all
609     @@@enDesc:
610     The name of subroutine to get.
611     @@NamedParam:
612     @@@Name: makeNewNode
613     @@@Type:
614     DOMMain:boolean
615     @@@enDesc:
616     Whether a new subroutine object should be created,
617     if it is not exist, or not.
618     @@Return:
619     @@@Type: ManakaiPerlSub
620     @@@enDesc:
621     The subroutine object.
622 wakaba 1.4 @@@nullCase:
623     @@@@enDesc:
624     Either the specified subroutine is not found and
625     the <P::makeNewNode> parameter is set to <DOM::false> or
626     the subroutine is defined as an alias.
627 wakaba 1.1 @@@PerlDef:
628     if ($self->{<Q::TreeCore:node>}->{<Q::pc:sub>}->{$subName}) {
629 wakaba 1.4 $r = ref $self->{<Q::TreeCore:node>}->{<Q::pc:sub>}->{$subName}
630     ? $self->{<Q::TreeCore:node>}->{<Q::pc:sub>}->{$subName} : null;
631 wakaba 1.1 } elsif ($makeNewNode) {
632     $r = $self->{<Q::TreeCore:node>}->{<Q::pc:sub>}->{$subName}
633     = <ClassM::ManakaiPerlSub.newObject>;
634     $self->{<Q::TreeCore:node>}
635     -><M::ManakaiDOM:ManakaiDOMNodeObject
636     ::ManakaiDOM:Perl.importTree> ($r);
637     $r->{<Q::pc:parent>} = $self->{<Q::TreeCore:node>};
638     $r->{<Q::pc:localName>} = $subName;
639     }
640     $r = $r-><M::ManakaiDOM:ManakaiDOMNodeObject
641     ::ManakaiDOM:Perl.newReference>
642     (<ClassName::ManakaiPerlSub>) if $r;
643    
644 wakaba 1.4 @Method:
645 wakaba 1.5 @@Name: setSub
646     @@enDesc:
647     Sets a subrotine.
648     @@Param:
649     @@@Name: subName
650     @@@Type:
651     DISLang:String::ManakaiDOM:all
652     @@@enDesc:
653     The name of the subroutine.
654     \
655     {NOTE:: The <P::subName> value must be equal to the
656     <A::ManakaiPerlSub.localName> of the <P::subArg>.
657     @@Param:
658     @@@Name: subArg
659     @@@Type: ManakaiPerlSub
660     @@@enDesc:
661     The subroutine object.
662     @@Return:
663     @@@RaiseException:
664     @@@@@:IN_USE_NODE_ERR
665     @@@@enDesc:
666     An attempt is made to set a subroutine that is
667     already used elsewhere.
668     @@@PerlDef:
669     my $ops = $self->{<Q::TreeCore:node>}->{<Q::pc:sub>};
670     if (ref $ops->{$subName}) {
671     CORE::delete $ops->{<Q::pc:parent>};
672     $ops->{$subName}
673     -><M::ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl.orphanate>;
674     }
675     if ($subArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
676     __EXCEPTION{IN_USE_NODE_ERR::
677     pc:parentNode => {$subArg->{<Q::TreeCore:node>}
678     ->{<Q::pc:parent>}},
679     pc:childNode => {$subArg},
680     }__;
681     }
682     $self->{<Q::TreeCore:node>}-><M::MNodeObject.importTree>
683     ($subArg->{<Q::TreeCore:node>});
684     $ops->{$subName} = $subArg->{<Q::TreeCore:node>};
685     $subArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}
686     = $self->{<Q::TreeCore:node>};
687    
688     @Method:
689 wakaba 1.4 @@Name: getSubAliasName
690     @@enDesc:
691     Gets the real name of a subroutine.
692     @@Param:
693     @@@Name: subName
694     @@@Type:
695     DISLang:String::ManakaiDOM:all
696     @@@enDesc:
697     The name of the alias subroutine.
698     @@Return:
699     @@@Type:
700     DISLang:String::ManakaiDOM:all
701     @@@enDesc:
702     The real name.
703     @@@nullCase:
704     @@@@enDesc:
705     The specified name is used.
706     @@@InCase:
707     @@@@Value:\#CODE
708     @@@@enDesc:
709     The specified name is not an alias.
710     @@@PerlDef:
711     if ($self->{<Q::TreeCore:node>}->{<Q::sub>}->{$subName}) {
712     $r = ref $self->{<Q::TreeCore:node>}
713     ->{<Q::sub>}->{$subName}
714     ? q<#CODE> : $self->{<Q::TreeCore:node>}
715     ->{<Q::sub>}->{$subName};
716     }
717    
718     @Method:
719     @@Name: setSubAliasName
720     @@enDesc:
721     Sets a subroutine name as an alias of another subroutine.
722     @@Param:
723     @@@Name: aliasName
724     @@@Type:
725     DISLang:String::ManakaiDOM:all
726     @@@enDesc:
727     The alias name.
728     @@Param:
729     @@@Name: realName
730     @@@Type:
731     DISLang:String::ManakaiDOM:all
732     @@@enDesc:
733     The real name.
734     @@Return:
735     @@@UnknownOperatorException:
736     @@@PerlDef:
737     my $ops = $self->{<Q::TreeCore:node>}->{<Q::sub>};
738     if (ref $ops->{$aliasName}) {
739     CORE::delete $ops->{<Q::pc:parent>};
740     $ops->{$aliasName}
741     -><M::ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl.orphanate>;
742     }
743     $ops->{$aliasName} = $realName;
744    
745     @Method:
746     @@Name: getOverloadSub
747     @@enDesc:
748     Gets an overloading subroutine.
749     @@Param:
750     @@@Name: opName
751     @@@Type:
752     DISLang:String::ManakaiDOM:all
753     @@@enDesc:
754     The name of the overloaded operator.
755     @@NamedParam:
756     @@@Name: makeNewNode
757     @@@Type:
758     DOMMain:boolean
759     @@@enDesc:
760     Whether a new subroutine object should be created,
761     if it is not exist, or not.
762     @@Return:
763     @@@Type: ManakaiPerlSub
764     @@@enDesc:
765     The subroutine object.
766     @@@nullCase:
767     @@@@enDesc:
768     Either the specified subroutine is not found and
769     the <P::makeNewNode> parameter is set to <DOM::false> or
770     the specified operator is overloaded by specifying method name.
771     @@@UnknownOperatorException:
772     @@@PerlDef:
773     unless (<Code::operatorNameList>->{$opName}) {
774     __EXCEPTION{UNSUPPORTED_OPERATOR_ERR::
775     pc:operator => {$opName},
776     }__;
777     }
778     if ($self->{<Q::TreeCore:node>}->{<Q::dis2pm:operator>}->{$opName}) {
779     $r = ref $self->{<Q::TreeCore:node>}
780     ->{<Q::dis2pm:operator>}->{$opName}
781     ? $self->{<Q::TreeCore:node>}
782     ->{<Q::dis2pm:operator>}->{$opName} : null;
783     } elsif ($makeNewNode) {
784     $r = $self->{<Q::TreeCore:node>}->{<Q::dis2pm:operator>}->{$opName}
785     = <ClassM::ManakaiPerlSub.newObject>;
786     $self->{<Q::TreeCore:node>}
787     -><M::ManakaiDOM:ManakaiDOMNodeObject
788     ::ManakaiDOM:Perl.importTree> ($r);
789     $r->{<Q::pc:parent>} = $self->{<Q::TreeCore:node>};
790     }
791     $r = $r-><M::ManakaiDOM:ManakaiDOMNodeObject
792     ::ManakaiDOM:Perl.newReference>
793     (<ClassName::ManakaiPerlSub>) if $r;
794    
795     @Method:
796 wakaba 1.5 @@Name: setOverloadSub
797     @@enDesc:
798     Sets an overloading subrotine.
799     @@Param:
800     @@@Name: opName
801     @@@Type:
802     DISLang:String::ManakaiDOM:all
803     @@@enDesc:
804     The name of the opeartor to overload.
805     @@Param:
806     @@@Name: subArg
807     @@@Type: ManakaiPerlSub
808     @@@enDesc:
809     The subroutine object.
810     @@Return:
811     @@@UnknownOperatorException:
812     @@@RaiseException:
813     @@@@@:IN_USE_NODE_ERR
814     @@@@enDesc:
815     An attempt is made to set a subroutine that is
816     already used elsewhere.
817     @@@PerlDef:
818     unless (<Code::operatorNameList>->{$opName}) {
819     __EXCEPTION{UNSUPPORTED_OPERATOR_ERR::
820     pc:operator => {$opName},
821     }__;
822     }
823     my $ops = $self->{<Q::TreeCore:node>}->{<Q::dis2pm:operator>};
824     if (ref $ops->{$opName}) {
825     CORE::delete $ops->{<Q::pc:parent>};
826     $ops->{$opName}
827     -><M::ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl.orphanate>;
828     }
829     if ($subArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
830     __EXCEPTION{IN_USE_NODE_ERR::
831     pc:parentNode => {$self},
832     pc:childNode => {$subArg},
833     }__;
834     }
835     $self->{<Q::TreeCore:node>}-><M::MNodeObject.importTree>
836     ($subArg->{<Q::TreeCore:node>});
837     $ops->{$opName} = $subArg->{<Q::TreeCore:node>};
838     $subArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}
839     = $self->{<Q::TreeCore:node>};
840    
841    
842     @Method:
843 wakaba 1.4 @@Name: getOverloadMethodName
844     @@enDesc:
845     Gets an overloading method name.
846     @@Param:
847     @@@Name: opName
848     @@@Type:
849     DISLang:String::ManakaiDOM:all
850     @@@enDesc:
851     The name of the overloaded operator.
852     @@Return:
853     @@@Type:
854     DISLang:String::ManakaiDOM:all
855     @@@enDesc:
856     The method name.
857     @@@nullCase:
858     @@@@enDesc:
859     The specified operator is not overloaded.
860     @@@InCase:
861     @@@@Value:\#CODE
862     @@@@enDesc:
863     The operator is overloaded by an anonymous subroutine.
864     @@@PerlDef:
865     if ($self->{<Q::TreeCore:node>}->{<Q::dis2pm:operator>}->{$opName}) {
866     $r = ref $self->{<Q::TreeCore:node>}
867     ->{<Q::dis2pm:operator>}->{$opName}
868     ? q<#CODE> : $self->{<Q::TreeCore:node>}
869     ->{<Q::dis2pm:operator>}->{$opName};
870     }
871    
872     @Method:
873     @@Name: setOverloadMethodName
874     @@enDesc:
875     Sets an overloading method name.
876     @@Param:
877     @@@Name: opName
878     @@@Type:
879     DISLang:String::ManakaiDOM:all
880     @@@enDesc:
881     The name of the overloaded operator.
882     @@Param:
883     @@@Name: methodName
884     @@@Type:
885     DISLang:String::ManakaiDOM:all
886     @@@enDesc:
887     The name of the method by which overloads an operator.
888     \
889     {NOTE:: The method may or may not belong to this package.
890     \
891     }
892     @@Return:
893     @@@UnknownOperatorException:
894     @@@PerlDef:
895     unless (<Code::operatorNameList>->{$opName}) {
896     __EXCEPTION{UNSUPPORTED_OPERATOR_ERR::
897     pc:operator => {$opName},
898     }__;
899     }
900     my $ops = $self->{<Q::TreeCore:node>}->{<Q::dis2pm:operator>};
901     if (ref $ops->{$opName}) {
902     CORE::delete $ops->{<Q::pc:parent>};
903     $ops->{$opName}
904     -><M::ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl.orphanate>;
905     }
906     $ops->{$opName} = $methodName;
907    
908 wakaba 1.1 @Attr:
909     @@Name: length
910     @@enDesc:
911     The number of child code fragments.
912     @@Type:
913     DOMMain:unsigned-long
914     @@Get:
915     @@@PerlDef:
916 wakaba 1.4 $r = keys (%{$self->{<Q::TreeCore:node>}->{<Q::pc:sub>}})
917     + keys (%{$self->{<Q::TreeCore:node>}->{<Q::dis2pm:operator>}});
918 wakaba 1.1
919     @Method:
920     @@Name: addIsaPackage
921     @@enDesc:
922     Adds a class package that this class inherits.
923     @@Param:
924     @@@Name: packageName
925     @@@Type:
926     Perl:package-name::ManakaiDOM:all
927     @@@enDesc:
928     The name of package to add.
929     @@Return:
930     @@@PerlDef:
931     push @{$self->{<Q::TreeCore:node>}->{<Q::dis:ISA>}}, $packageName;
932    
933     @Method:
934     @@Name: addImplementPackage
935     @@enDesc:
936     Adds a interface package that this class implements.
937     @@Param:
938     @@@Name: packageName
939     @@@Type:
940     Perl:package-name::ManakaiDOM:all
941     @@@enDesc:
942     The name of package to add.
943     @@Return:
944     @@@PerlDef:
945     $self->{<Q::TreeCore:node>}->{<Q::dis:Implement>}->{$packageName} = true;
946    
947     @ToStringMethod:
948     @@Return:
949     @@@Type:
950     DISLang:String
951     @@@enDesc:
952     Perl code.
953     @@@PerlDef:
954     my $file = $self-><AG::ManakaiPerlCodeFragment.parentNode>;
955     my $node = $self->{<Q::TreeCore:node>};
956     my $pn = $node->{<Q::pc:packageName>};
957     $r .= q<package > . $pn . ";\n";
958     __DEEP{
959     $file-><AS::ManakaiPerlFile.currentPackage> ($pn);
960     $r .= 'our $VERSION = '.
961     <ClassM::ManakaiPerlCodeImplementation.versionDateTime> (time).
962     ";\n";
963     }__;
964     my @isa = (@{$node->{<Q::dis:ISA>}},
965     sort keys %{$node->{<Q::dis:Implement>}});
966     if (@isa) {
967     $r .= 'push our @ISA, ' .
968     <ClassM::ManakaiPerlCodeImplementation.perlList> (\@isa) .
969     ";\n";
970     }
971 wakaba 1.4 for my $cnk (keys %{$node->{<Q::pc:sub>}}) {
972     my $cno = $node->{<Q::pc:sub>}->{$cnk};
973     if (ref $cno) {
974     my $cn = $cno-><M::ManakaiDOM:ManakaiDOMNodeObject
975     ::ManakaiDOM:Perl.newReference>
976     (<ClassName::ManakaiPerlSub>);
977     $r .= $cn->stringify;
978     } else {
979     $r .= qq<*$cnk = \&$cno;\n>;
980     }
981     }
982     my $op = '';
983     for my $cnk (keys %{$node->{<Q::dis2pm:operator>}}) {
984     my $cno = $node->{<Q::dis2pm:operator>}->{$cnk};
985     if (ref $cno) {
986     my $cn = $cno-><M::ManakaiDOM:ManakaiDOMNodeObject
987     ::ManakaiDOM:Perl.newReference>
988     (<ClassName::ManakaiPerlSub>);
989     $op .= <ClassM::ManakaiPerlCodeImplementation.perlLiteral> ($cnk)
990     . ' => ' . $cn->stringify . ', ';
991     } elsif (defined $cno) {
992     $op .= <ClassM::ManakaiPerlCodeImplementation.perlList>
993     ([$cnk => $cno]) . ', ';
994     }
995     }
996     $r .= 'use overload ' . $op . qq[fallback => 1;\n] if $op;
997 wakaba 1.1 ##PerlPackageScope
998    
999 wakaba 1.4 PropDef:
1000     @QName:
1001     dis2pm:operator
1002     @enDesc:
1003     Overloaded operators.
1004    
1005     ElementTypeBinding:
1006     @Name: UnknownOperatorException
1007     @ElementType:
1008     ManakaiDOM:raises
1009     @ShadowContent:
1010     @@@:UNSUPPORTED_OPERATOR_ERR
1011     @@enDesc:
1012     An attempt is made to overload an unknown operator.
1013    
1014     XParamDef:
1015     @QName:
1016     pc:operator
1017     @enDesc:
1018     An operator to overload.
1019    
1020     ResourceDef:
1021     @QName: operatorNameList
1022     @enDesc:
1023     The list of valid operators for <PerlModule::operator> pragma.
1024     @rdf:type:
1025     dis2pm:InlineCode
1026     @PerlDef:
1027     {qw[
1028     + 1 - 1 * 1 / 1 % 1 ** 1 << 1 >> 1 x 1 . 1
1029     += 1 -= 1 *= 1 /= 1 %= 1 **= 1 <<= 1 >>= 1 x= 1 .= 1
1030     < 1 <= 1 > 1 >= 1 == 1 != 1 <=> 1
1031     lt 1 le 1 gt 1 ge 1 eq 1 ne 1 cmp 1
1032     & 1 | 1 ^ 1 neg 1 ! 1 ~ 1
1033     ++ 1 -- 1 = 1
1034     atan2 1 cos 1 sin 1 exp 1 abs 1 log 1 sqrt 1
1035     bool 1 "" 1 0+ 1 ${} 1 @{} 1 %{} 1 &{} 1 *{} 1 <> 1
1036     nomethod 1
1037     ]}
1038    
1039 wakaba 1.1 ClsDef:
1040     @ClsQName: ManakaiPerlSub
1041     @ClsISA: ManakaiPerlCodeFragment
1042     @enDesc:
1043     Perl subroutines.
1044    
1045     @IntMethod:
1046     @@Name:newObject
1047     @@ManakaiDOM:isStatic:1
1048     @@Description:
1049     @@@lang:en
1050     @@@@:
1051     Creates a new instance object for <Class::ManakaiPerlSub>.
1052     @@Return:
1053     @@@Type:
1054     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
1055     @@@Description:
1056     @@@@lang:en
1057     @@@@@:
1058     The newly created node object.
1059     @@@PerlDef:
1060     @@@@@:
1061     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
1062     ::ManakaiDOM:Perl.new>;
1063     push @{$node->{<Q::TreeCore:subnode>}}, <Q::pc:childNodes>;
1064     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
1065     $node->{<Q::pc:childNodes>} = [];
1066     $node->{<Q::pc:sourceLine>} = 0;
1067     @@@@ImplNote:
1068     @@@@@lang:en
1069     @@@@@@:
1070     Optional properties: <Q::pc:localName>,
1071     <Q::pc:sourceFile>, <Q::pc:sourceLine>.
1072    
1073     @Attr:
1074     @@Name: length
1075     @@enDesc:
1076     The number of child code fragments.
1077     @@Type:
1078     DOMMain:unsigned-long
1079     @@Get:
1080     @@@PerlDef:
1081 wakaba 1.4 $r = @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}};
1082 wakaba 1.1
1083     @Attr:
1084 wakaba 1.5 @@Name: localName
1085 wakaba 1.1 @@enDesc:
1086     The name of this subroutine.
1087     @@Type:
1088     DISPerl:SubName
1089     @@Get:
1090 wakaba 1.5 @@@nullCase:
1091     @@@@enDesc:
1092     This subroutine has no name.
1093 wakaba 1.1 @@@disDef:
1094     @@@@GetProp: localName
1095 wakaba 1.5 @@Set:
1096     @@@enDesc:
1097     Sets the name of this subroutine.
1098     \
1099     {NOTE:: Setting this attribute does not change the
1100     name by which the subroutine is registerred to
1101     the parent object.
1102     \
1103     }
1104     @@@nullCase:
1105     @@@@enDesc:
1106     This subroutine has no name.
1107     @@@disDef:
1108     @@@@SetProp: localName
1109 wakaba 1.1
1110     @Attr:
1111     @@Name: prototype
1112     @@enDesc:
1113     The prototype of this subroutine.
1114     @@Type:
1115     DISPerl:SubPrototype
1116     @@Get:
1117     @@@disDef:
1118     @@@@GetProp: prototype
1119     @@@nullCase:
1120     @@@@enDesc:
1121     No prototype is set.
1122     @@Set:
1123     @@@disDef:
1124     @@@@SetProp: prototype
1125     @@@nullCase:
1126     @@@@enDesc:
1127     No prototype declaration.
1128    
1129     @Attr:
1130     @@Name: currentSourceFile
1131     @@enDesc:
1132     The current source file name that is referred when
1133     a code fragment is added.
1134     @@Type:
1135     DISLang:String
1136     @@Get:
1137     @@@nullCase:
1138     @@@@enDesc: No source file name is set.
1139     @@@disDef:
1140     @@@@GetProp: sourceFile
1141     @@Set:
1142     @@@nullCase:
1143     @@@@enDesc: No (or unknown) source file.
1144     @@@disDef:
1145     @@@@SetProp: sourceFile
1146    
1147     @Attr:
1148     @@Name: currentSourceLine
1149     @@enDesc:
1150     The current line number in source file that is referred when
1151     a code fragment is added.
1152     @@Type:
1153     DOMMain:unsigned-long
1154     @@Get:
1155     @@@disDef:
1156     @@@@GetProp: sourceLine
1157     @@Set:
1158     @@@disDef:
1159     @@@@SetProp: sourceLine
1160    
1161     @Method:
1162 wakaba 1.5 @@Name: appendCodeFragment
1163     @@enDesc:
1164     Appends a <Class::ManakaiPerlCodeFragment> object.
1165     @@Param:
1166     @@@Name: codeArg
1167     @@@Type: ManakaiPerlCodeFragment
1168     @@@enDesc:
1169     A code fragment object.
1170     @@Return:
1171     @@@RaiseException:
1172     @@@@@:BAD_CHILD_ERR
1173     @@@@enDesc:
1174     An attempt is made to append a child
1175     that is not a <Class::ManakaiPerlUnparsedCode>.
1176     @@@RaiseException:
1177     @@@@@:IN_USE_NODE_ERR
1178     @@@@enDesc:
1179     An attempt is made to append a node that is
1180     already used elsewhere.
1181     @@@PerlDef:
1182     if (UNIVERSAL::isa ($codeArg, <ClassName::ManakaiPerlUnparsedCode>)) {
1183     if ($codeArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}) {
1184     __EXCEPTION{IN_USE_NODE_ERR::
1185     pc:parentNode => {$codeArg->{<Q::TreeCore:node>}
1186     ->{<Q::pc:parent>}},
1187     pc:childNode => {$codeArg},
1188     }__;
1189     }
1190     $self->{<Q::TreeCore:node>}-><M::MNodeObject.importTree>
1191     ($codeArg->{<Q::TreeCore:node>});
1192     push @{$self->{<Q::TreeCore:node>}->{<Q::pc:childNodes>}},
1193     $codeArg->{<Q::TreeCore:node>};
1194     $codeArg->{<Q::TreeCore:node>}->{<Q::pc:parent>}
1195     = $self->{<Q::TreeCore:node>};
1196     } else {
1197     __EXCEPTION{BAD_CHILD_ERR::
1198     pc:parentNode => {$self},
1199     pc:childNode => {$codeArg},
1200     }__;
1201     }
1202    
1203     @Method:
1204 wakaba 1.1 @@Name: appendCode
1205     @@enDesc:
1206     Appends an unparsed Perl code fragment.
1207     @@Param:
1208     @@@Name: codeArg
1209     @@@Type:
1210     lang:Perl::ManakaiDOM:all
1211     @@@enDesc:
1212     An unparsed Perl code fragment.
1213     @@Return:
1214     @@@Type: ManakaiPerlUnparsedCode
1215     @@@enDesc:
1216     The newly created Perl code object.
1217     @@@PerlDef:
1218     $r = <ClassM::ManakaiPerlUnparsedCode.newObject>;
1219     my $node = $self->{<Q::TreeCore:node>};
1220     $r->{<Q::sourceFile>} = $node->{<Q::sourceFile>};
1221     $r->{<Q::sourceLine>} = $node->{<Q::sourceLine>};
1222     $r->{<Q::code>} = $codeArg;
1223     $node->{<Q::sourceLine>} += ($codeArg =~ tr/\x0A/\x0A/);
1224     $r = $r-><M::ManakaiDOM:ManakaiDOMNodeObject
1225     ::ManakaiDOM:Perl.newReference>
1226 wakaba 1.5 (<ClassName::ManakaiPerlUnparsedCode>);
1227     ## TODO: child & import
1228 wakaba 1.1
1229     @Method:
1230     @@Name: skipLines
1231     @@enDesc:
1232     Skips lines in a code.
1233     @@Param:
1234     @@@Name: codeArg
1235     @@@Type:
1236     lang:Perl::ManakaiDOM:all
1237     @@@enDesc:
1238     A code fragment, which is counted lines.
1239     @@Return:
1240     @@@PerlDef:
1241     $self->{<Q::TreeCore:node>}->{<Q::sourceLine>}
1242     += ($codeArg =~ tr/\x0A/\x0A/);
1243 wakaba 1.4
1244     @ToStringMethod:
1245     @@Return:
1246     @@@Type:
1247     DISLang:String
1248     @@@enDesc:
1249     Perl code.
1250     @@@PerlDef:
1251     my $node = $self->{<Q::TreeCore:node>};
1252     $r = q<sub>;
1253     $r .= ' ' . $node->{<Q::pc:localName>}
1254     if defined $node->{<Q::pc:localName>};
1255     $r .= ' (' . $node->{<Q::pc:prototype>} . ')'
1256     if defined $node->{<Q::pc:prototype>};
1257     $r .= " {\n";
1258    
1259     $r .= "}\n";
1260 wakaba 1.1 ##PerlSub
1261    
1262 wakaba 1.5 XParamDef:
1263     @QName: parentNode
1264     @enDesc:
1265     Parent node.
1266    
1267     XParamDef:
1268     @QName: childNode
1269     @enDesc:
1270     Child node.
1271    
1272 wakaba 1.1 ClsDef:
1273     @ClsQName: ManakaiPerlUnparsedCode
1274     @ClsISA: ManakaiPerlCodeFragment
1275     @enDesc:
1276     Unparsed Perl code fragments.
1277    
1278     @IntMethod:
1279     @@Name:newObject
1280     @@ManakaiDOM:isStatic:1
1281     @@Description:
1282     @@@lang:en
1283     @@@@:
1284     Creates a new instance object for <Class::ManakaiPerlUnparsedCode>.
1285     @@Return:
1286     @@@Type:
1287     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
1288     @@@Description:
1289     @@@@lang:en
1290     @@@@@:
1291     The newly created node object.
1292     @@@PerlDef:
1293     @@@@@:
1294     my $node = $r = <ClassM::ManakaiDOM:ManakaiDOMNodeObject
1295     ::ManakaiDOM:Perl.new>;
1296     push @{$node->{<Q::TreeCore:origin>}}, <Q::pc:parent>;
1297     $node->{<Q::pc:code>} = '';
1298     @@@@ImplNote:
1299     @@@@@lang:en
1300     @@@@@@:
1301 wakaba 1.5 Optional properties: <Q::pc:code>.
1302    
1303     @Attr:
1304     @@Name: code
1305     @@enDesc:
1306     Perl code.
1307     @@Type:
1308     lang:Perl::ManakaiDOM:all
1309     @@Get:
1310     @@@disDef:
1311     @@@@GetProp: code
1312     @@Set:
1313     @@@disDef:
1314     @@@@SetProp: code
1315    
1316     @Attr:
1317     @@Name: sourceFile
1318     @@enDesc:
1319     The source file name of this fragment.
1320     @@Type:
1321     DISLang:String
1322     @@Get:
1323     @@@enDesc:
1324     Any string identifying the source.
1325     @@@nullCase:
1326     @@@@enDesc: No source file name is set.
1327     @@@disDef:
1328     @@@@GetProp: sourceFile
1329     @@Set:
1330     @@@nullCase:
1331     @@@@enDesc: No (or unknown) source file.
1332     @@@disDef:
1333     @@@@SetProp: sourceFile
1334    
1335     @Attr:
1336     @@Name: sourceLine
1337     @@enDesc:
1338     Source file line number of the first line of this fragment.
1339     @@Type:
1340     DOMMain:unsigned-long
1341     @@Get:
1342     @@@disDef:
1343     @@@@GetProp: sourceLine
1344     @@Set:
1345     @@@disDef:
1346     @@@@SetProp: sourceLine
1347 wakaba 1.1 ##PerlUnparsedCode
1348    
1349 wakaba 1.5 ElementTypeBinding:
1350     @Name: RaiseException
1351     @ElementType:
1352     ManakaiDOM:raises
1353    
1354 wakaba 1.1 ClsDef:
1355     @ClsQName: ManakaiPerlCodeImplementation
1356     @enDesc:
1357     The class that provides factory methods.
1358    
1359     @Role:
1360     @@@:
1361     DOMCore:DOMImplementation::ManakaiDOM:ManakaiDOM
1362     @@compat:
1363     DOMCore:ManakaiDOMImplementation::ManakaiDOM:ManakaiDOMLatest
1364    
1365     @Method:
1366     @@Name: createPerlFile
1367     @@enDesc:
1368     Creates a Perl code file.
1369     @@Return:
1370     @@@Type: ManakaiPerlFile
1371     @@@enDesc: A newly created Perl source file object.
1372     @@@PerlDef:
1373     $r = <ClassM::ManakaiPerlFile.newObject>;
1374     $r = $r-><M::ManakaiDOM:ManakaiDOMNodeObject
1375     ::ManakaiDOM:Perl.newReference>
1376     (<ClassName::ManakaiPerlFile>);
1377    
1378     @IntMethod:
1379     @@Name: perlComment
1380     @@ManakaiDOM:isStatic:1
1381     @@enDesc:
1382     Generates a Perl comment string.
1383     @@Param:
1384     @@@Name: str
1385     @@@Type:
1386     DISLang:String
1387     @@@enDesc:
1388     A comment text.
1389     @@Return:
1390     @@@Type:
1391     DISLang:String
1392     @@@enDesc:
1393     A Perl comment string.
1394     @@@PerlDef:
1395     $r = $str;
1396     $r =~ s/\n/\n## /g;
1397     $r =~ s/\n## $/\n/s;
1398     $r .= "\n" unless $r =~ /\n$/;
1399     $r = q<## > . $r;
1400    
1401     @IntMethod:
1402     @@Name: rfc3339DateTime
1403     @@ManakaiDOM:isStatic:1
1404     @@enDesc:
1405     Returns RFC 3339 <CODE::date-time> representation of a date.
1406     @@Param:
1407     @@@Name: perlDate
1408     @@@Type:
1409     DOMMain:unsigned-long
1410     @@@enDesc:
1411     A Perl representation of date.
1412     @@Return:
1413     @@@Type:
1414     DISLang:String
1415     @@@enDesc:
1416     RFC 3339 date string.
1417     @@@PerlDef:
1418     my @time = gmtime $perlDate;
1419     $r = sprintf q<%04d-%02d-%02dT%02d:%02d:%02d+00:00>,
1420     $time[5] + 1900, $time[4] + 1, @time[3,2,1,0];
1421    
1422     @IntMethod:
1423     @@Name: versionDateTime
1424     @@ManakaiDOM:isStatic:1
1425     @@enDesc:
1426     Returns date for version.
1427     @@Param:
1428     @@@Name: perlDate
1429     @@@Type:
1430     DOMMain:unsigned-long
1431     @@@enDesc:
1432     A Perl representation of date.
1433     @@Return:
1434     @@@Type:
1435     DISLang:String
1436     @@@enDesc:
1437     A Perl number literal.
1438     @@@PerlDef:
1439     my @time = gmtime $perlDate;
1440     $r = sprintf q<%04d%02d%02d.%02d%02d>,
1441     $time[5] + 1900, $time[4] + 1, @time[3,2,1];
1442    
1443     @Method:
1444     @@Name: perlLiteral
1445     @@enDesc:
1446     Perl code representation.
1447     @@Param:
1448     @@@Name: val
1449     @@@Type:
1450     DOMMain:any
1451     @@@enDesc:
1452     A Perl value.
1453     @@Return:
1454     @@@Type:
1455     DISLang:String
1456     @@@enDesc:
1457     A Perl lexical representation of <P::val>.
1458     @@@PerlDef:
1459     unless (defined $val) {
1460     $r = q<undef>;
1461     } elsif (ref $val eq 'ARRAY') {
1462     __DEEP{
1463     $r = q<[> . <ClassM::ManakaiPerlCodeImplementation
1464     .perlLiteral> ($val) . q<]>;
1465     }__;
1466     } elsif (ref $val eq 'HASH') {
1467     __DEEP{
1468     $r = q<{> . <ClassM::ManakaiPerlCodeImplementation
1469     .perlLiteral> ([%$val]) . q<}>;
1470     }__;
1471     } else {
1472     $val =~ s/(['\\])/\\$1/g;
1473     $r = q<'> . $val . q<'>;
1474     }
1475    
1476     @Method:
1477     @@Name: perlList
1478     @@enDesc:
1479     Perl code representation of a list.
1480     @@Param:
1481     @@@Name: val
1482     @@@Type:
1483     Perl:ARRAY
1484     @@@enDesc:
1485     A Perl array reference.
1486     @@Return:
1487     @@@Type:
1488     DISLang:String
1489     @@@enDesc:
1490     A Perl lexical representation of <CODE::@$val>.
1491     @@@PerlDef:
1492     __DEEP{
1493     $r = join (q<, >, map {<ClassM::ManakaiPerlCodeImplementation
1494     .perlLiteral> ($_)} @{$val});
1495     }__;
1496 wakaba 1.5
1497     @Method:
1498     @@Name: createPerlSub
1499     @@enDesc:
1500     Creates a new <Class::ManakaiPerlSub> object.
1501     @@Param:
1502     @@@Name: subName
1503     @@@Type:
1504     DISLang:String
1505     @@@enDesc:
1506     The name of the subroutine to create.
1507     @@@nullCase:
1508     @@@@enDesc:
1509     The subroutine created has no name.
1510     @@Return:
1511     @@@Type:ManakaiPerlSub
1512     @@@enDesc:
1513     Newly created Perl subroutine object.
1514     @@@PerlDef:
1515     __DEEP{
1516     $r = <ClassM::ManakaiPerlSub.newObject>
1517     -><M::MNodeObject.newReference> (<ClassName::ManakaiPerlSub>);
1518     $r-><M::ManakaiPerlSub.localName> ($subName) if defined $subName;
1519     }__;
1520    
1521     @Method:
1522     @@Name: createPerlUnparsedCode
1523     @@enDesc:
1524     Creates a new <Class::ManakaiPerlUnparsedCode> object.
1525     @@Param:
1526     @@@Name: codeArg
1527     @@@Type:
1528     lang:Perl::ManakaiDOM:all
1529     @@@enDesc:
1530     The code fragment.
1531     @@@nullCase:
1532     @@@@enDesc:
1533     The fragment initially has no code.
1534     @@Return:
1535     @@@Type:ManakaiPerlUnparsedCode
1536     @@@enDesc:
1537     Newly created Perl code object.
1538     @@@PerlDef:
1539     __DEEP{
1540     $r = <ClassM::ManakaiPerlUnparsedCode.newObject>
1541     -><M::MNodeObject.newReference>
1542     (<ClassName::ManakaiPerlUnparsedCode>);
1543     $r-><M::ManakaiPerlUnparsedCode.code> ($codeArg) if defined $codeArg;
1544     }__;
1545 wakaba 1.1 ##PerlCodeImplementation
1546    
1547 wakaba 1.5 ResourceDef:
1548     @QName: MNodeObject
1549     @rdf:type:
1550     ManakaiDOM:Class
1551     @AliasFor:
1552     ManakaiDOM:ManakaiDOMNodeObject::ManakaiDOM:Perl
1553    
1554 wakaba 1.1 PropDef:
1555     @QName: code
1556     @enDesc: Perl code.
1557    
1558     PropDef:
1559     @QName: sourceFile
1560     @enDesc:
1561     Source file.
1562    
1563     PropDef:
1564     @QName: sourceLine
1565     @enDesc:
1566     Source line number.
1567    
1568     PropDef:
1569     @QName: prototype
1570     @enDesc:
1571     Prototype of subroutine.
1572    
1573     PropDef:
1574     @QName: parent
1575     @enDesc:
1576     Higher-level object.
1577    
1578     PropDef:
1579     @QName: sub
1580     @enDesc:
1581     Perl subroutines.
1582    
1583     PropDef:
1584     @QName: packageName
1585     @Type:
1586     Perl:package-name
1587     @enDesc:
1588     The fully qualified names of packages.
1589    
1590     PropDef:
1591     @QName: childNodes
1592     @enDesc:
1593     Child code fragments.
1594    
1595     PropDef:
1596     @QName: localName
1597     @enDesc:
1598     Scoped names.
1599 wakaba 1.4
1600     ## -- Exceptions
1601    
1602     ExceptionDef:
1603     @ClsQName: ManakaiPerlCodeException
1604     @enDesc:
1605     Exceptions for the <Module::PerlCode> module.
1606     @ClsISA:
1607     ManakaiDOM:ManakaiDOMException::ManakaiDOM:Perl
1608     @XConstGroupDef:
1609     @@ClsQName: ManakaiPerlCodeExceptionCode
1610     @@enDesc:
1611     Exception codes for <Class::ManakaiPerlCodeException>.
1612 wakaba 1.5 @@XConstDef:
1613     @@@Name: HIERARCHY_REQUEST_ERR
1614     @@@Value:3
1615     @@@enDesc:
1616     An attempt is made to break the hierarchy.
1617     @@@XSubTypeDef:
1618     @@@@QName: BAD_CHILD_ERR
1619     @@@@enDesc:
1620     An attempt is made to append a node as a child whose type
1621     is not allowed.
1622     @@@@XParam:
1623     @@@@@QName: childNode
1624     @@@@@enDesc:
1625     The node attempted to append.
1626     @@@@XParam:
1627     @@@@@QName: parentNode
1628     @@@@@enDesc:
1629     The node to whose child list an attempt to append is made.
1630     @@@XSubTypeDef:
1631     @@@@QName: IN_USE_NODE_ERR
1632     @@@@enDesc:
1633     An attempt is made to append a node that has already been used
1634     elsewhere.
1635     @@@@XParam:
1636     @@@@@QName: childNode
1637     @@@@@enDesc:
1638     The node attempted to append.
1639     @@@@XParam:
1640     @@@@@QName: parentNode
1641     @@@@@enDesc:
1642     The parent node of the <XP::childNode>.
1643 wakaba 1.4 @@XConstDef:
1644     @@@Name: NOT_SUPPORTED_ERR
1645     @@@Value:9
1646     @@@enDesc:
1647     An attempt is made to do something the implementation does not support.
1648     @@@XSubTypeDef:
1649     @@@@QName: UNSUPPORTED_OPERATOR_ERR
1650     @@@@enDesc:
1651     The implementation does not support the specified operator.
1652     @@@@XParam:
1653     @@@@@QName: operator
1654     @@@@@enDesc:
1655     The operator that is not supported.
1656     @@@@enMufDef:
1657     Operator "%p (name => {<Q::pc:operator>});" is not supported
1658    
1659     ElementTypeBinding:
1660     @Name: ExceptionDef
1661     @ElementType:
1662     dis:ResourceDef
1663     @ShadowContent:
1664     @@rdf:type:
1665     ManakaiDOM:ExceptionClass
1666     @@AliasFor:
1667     @@@@:
1668     ::ManakaiDOM:Perl
1669     @@@For:
1670     !=ManakaiDOM:Perl
1671     @@ForCheck:
1672     ManakaiDOM:Perl
1673     @@DOMMain:implementFeature: CoreFeature10
1674    
1675     ElementTypeBinding:
1676     @Name: XConstGroupDef
1677     @ElementType:
1678     dis:ResourceDef
1679     @ShadowContent:
1680     @@rdf:type:
1681     ManakaiDOM:ConstGroup
1682     @@Type:
1683     DOMMain:unsigned-short::ManakaiDOM:all
1684     @@rdfs:subClassOf:
1685     DOMMain:unsigned-short::ManakaiDOM:all
1686    
1687     ElementTypeBinding:
1688     @Name: XConstDef
1689     @ElementType:
1690     dis:ResourceDef
1691     @ShadowContent:
1692     @@rdf:type:
1693     ManakaiDOM:Const
1694    
1695     ElementTypeBinding:
1696     @Name: XSubTypeDef
1697     @ElementType:
1698     dis:ResourceDef
1699     @ShadowContent:
1700     @@rdf:type:
1701     ManakaiDOM:ExceptionOrWarningSubType
1702    
1703     ElementTypeBinding:
1704     @Name: XParam
1705     @ElementType:
1706     ManakaiDOM:exceptionOrWarningParameter
1707    
1708     ElementTypeBinding:
1709     @Name: XParamDef
1710     @ElementType:
1711     dis:ResourceDef
1712     @ShadowContent:
1713     @@rdf:type:
1714     DOMMain:XWParameter
1715     @@AliasFor:
1716     @@@For:
1717     !=ManakaiDOM:all
1718     @@@@:
1719     ::ManakaiDOM:all
1720    
1721     ElementTypeBinding:
1722     @Name: enMufDef
1723     @ElementType:
1724     dis:Def
1725     @ShadowContent:
1726     @@ContentType:
1727     lang:muf
1728     @@lang:en
1729    
1730 wakaba 1.1
1731     ElementTypeBinding:
1732     @Name: ClsDef
1733     @ElementType:
1734     dis:ResourceDef
1735     @ShadowContent:
1736     @@rdf:type:
1737     ManakaiDOM:Class
1738     @@AliasFor:
1739     @@@@:
1740     ::ManakaiDOM:Perl
1741     @@@For:
1742     !=ManakaiDOM:Perl
1743     @@ForCheck:
1744     ManakaiDOM:Perl
1745     @@DOMMain:implementFeature: CoreFeature10
1746    
1747     ElementTypeBinding:
1748     @Name: ClsQName
1749     @ElementType:
1750     dis:QName
1751    
1752     ElementTypeBinding:
1753     @Name: ClsISA
1754     @ElementType:
1755     dis:ISA
1756    
1757     ElementTypeBinding:
1758     @Name: Method
1759     @ElementType:
1760     dis:ResourceDef
1761     @ShadowContent:
1762     @@rdf:type:
1763     DISLang:Method
1764    
1765     ElementTypeBinding:
1766     @Name: ToStringMethod
1767     @ElementType:
1768     dis:ResourceDef
1769     @ShadowContent:
1770     @@rdf:type:
1771     DISLang:Method
1772     @@Operator:
1773     @@@@:
1774     DISPerl:AsStringMethod
1775     @@@ContentType:
1776     dis:TypeQName
1777     @@Description:
1778     @@@lang:en
1779     @@@@:
1780     Returns the textual Perl source code representation of this object.
1781    
1782     ElementTypeBinding:
1783     @Name: IntMethod
1784     @ElementType:
1785     dis:ResourceDef
1786     @ShadowContent:
1787     @@rdf:type:
1788     DISLang:Method
1789     @@ManakaiDOM:isForInternal:1
1790    
1791     ElementTypeBinding:
1792     @Name: Attr
1793     @ElementType:
1794     dis:ResourceDef
1795     @ShadowContent:
1796     @@rdf:type:
1797     DISLang:Attribute
1798    
1799     ElementTypeBinding:
1800     @Name: Return
1801     @ElementType:
1802     dis:ResourceDef
1803     @ShadowContent:
1804     @@rdf:type:
1805     DISLang:MethodReturn
1806    
1807     ElementTypeBinding:
1808     @Name: Get
1809     @ElementType:
1810     dis:ResourceDef
1811     @ShadowContent:
1812     @@rdf:type:
1813     DISLang:AttributeGet
1814    
1815     ElementTypeBinding:
1816     @Name: Set
1817     @ElementType:
1818     dis:ResourceDef
1819     @ShadowContent:
1820     @@rdf:type:
1821     DISLang:AttributeSet
1822    
1823     ElementTypeBinding:
1824     @Name: Param
1825     @ElementType:
1826     dis:ResourceDef
1827     @ShadowContent:
1828     @@rdf:type:
1829     DISLang:MethodParameter
1830    
1831     ElementTypeBinding:
1832     @Name: PerlDef
1833     @ElementType:
1834     dis:Def
1835     @ShadowContent:
1836     @@ContentType:
1837     lang:Perl
1838    
1839     ElementTypeBinding:
1840     @Name: disDef
1841     @ElementType:
1842     dis:Def
1843     @ShadowContent:
1844     @@ContentType:
1845     lang:dis
1846    
1847     ElementTypeBinding:
1848     @Name: InCase
1849     @ElementType:
1850     dis:ResourceDef
1851     @ShadowContent:
1852     @@rdf:type:
1853     ManakaiDOM:InCase
1854    
1855     ElementTypeBinding:
1856     @Name: nullCase
1857     @ElementType:
1858     dis:ResourceDef
1859     @ShadowContent:
1860     @@rdf:type:
1861     ManakaiDOM:InCase
1862     @@Value:
1863     @@@is-null:1
1864    
1865     ElementTypeBinding:
1866     @Name: TrueCase
1867     @ElementType:
1868     dis:ResourceDef
1869     @ShadowContent:
1870     @@rdf:type:
1871     ManakaiDOM:InCase
1872     @@Value:true
1873     @@Type:
1874     DOMMain:boolean
1875    
1876    
1877     ElementTypeBinding:
1878     @Name: FalseCase
1879     @ElementType:
1880     dis:ResourceDef
1881     @ShadowContent:
1882     @@rdf:type:
1883     ManakaiDOM:InCase
1884     @@Value:false
1885     @@Type:
1886     DOMMain:boolean
1887    
1888     ElementTypeBinding:
1889     @Name: enDesc
1890     @ElementType:
1891     dis:Description
1892     @ShadowContent:
1893     @@lang:en
1894    
1895     ElementTypeBinding:
1896     @Name: PropDef
1897     @ElementType:
1898     dis:ResourceDef
1899     @ShadowContent:
1900     @@rdf:type:
1901     rdf:Property
1902     @@AliasFor:
1903     @@@@:
1904     ::ManakaiDOM:all
1905     @@@For:
1906     !=ManakaiDOM:all
1907    
1908     ElementTypeBinding:
1909     @Name: NamedParam
1910     @ElementType:
1911     dis:ResourceDef
1912     @ShadowContent:
1913     @@rdf:type:
1914     DISLang:MethodParameter
1915     @@DISPerl:isNamedParameter:1
1916    

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24