Date: Sunday December 01, 2019 @ 05:18 Author: argrath Update of /cvsroot/perldocjp/docs/modules/base-2.22 In directory sf-cvs:/tmp/cvs-serv67340/modules/base-2.22 Added Files: base.pod fields.pod Log Message: base-2.22 =================================================================== File: base.pod Status: Up-to-date Working revision: 1.1 Sat Nov 30 20:18:26 2019 Repository revision: 1.1 /cvsroot/perldocjp/docs/modules/base-2.22/base.pod,v Existing Tags: No Tags Exist =================================================================== File: fields.pod Status: Up-to-date Working revision: 1.1 Sat Nov 30 20:18:26 2019 Repository revision: 1.1 /cvsroot/perldocjp/docs/modules/base-2.22/fields.pod,v Existing Tags: No Tags Exist -------------- next part -------------- Index: docs/modules/base-2.22/base.pod diff -u /dev/null docs/modules/base-2.22/base.pod:1.1 --- /dev/null Sun Dec 1 05:18:26 2019 +++ docs/modules/base-2.22/base.pod Sun Dec 1 05:18:26 2019 @@ -0,0 +1,175 @@ + +=encoding euc-jp + +=head1 NAME + +=begin original + +base - Establish an ISA relationship with base classes at compile time + +=end original + +base - ¥³¥ó¥Ñ¥¤¥ë»þ¤Ë´ðÄ쥯¥é¥¹¤È¤Î ISA ´Ø·¸¤ò¹½ÃÛ¤¹¤ë + +=head1 SYNOPSIS + + package Baz; + use base qw(Foo Bar); + +=head1 DESCRIPTION + +=begin original + +Unless you are using the C<fields> pragma, consider this module discouraged +in favor of the lighter-weight C<parent>. + +=end original + +C<fields> ¥×¥é¥°¥Þ¤ò»È¤Ã¤Æ¤¤¤ë¤Î¤Ç¤Ê¤¤¸Â¤ê¡¢¤³¤Î¥â¥¸¥å¡¼¥ë¤ÏÈó¿ä¾©¤Ç¤¹; +Âå¤ï¤ê¤Ë·ÚÎÌ¤Ê C<parent> ¤ò»È¤Ã¤Æ¤¯¤À¤µ¤¤¡£ + +=begin original + +Allows you to both load one or more modules, while setting up inheritance from +those modules at the same time. Roughly similar in effect to + +=end original + +°ì¤Ä¤Þ¤¿¤ÏÊ£¿ô¤Î¥â¥¸¥å¡¼¥ë¤òÆɤ߹þ¤ó¤Ç¡¢¤½¤ì¤é¤Î¥â¥¸¥å¡¼¥ë¤«¤é·Ñ¾µ¤¹¤ë¤Î¤ò +Ʊ»þ¤Ë¹Ô¤¤¤Þ¤¹¡£ +¤ª¤ª¤è¤½¼¡¤Î¤è¤¦¤Ê¸ú²Ì¤¬¤¢¤ê¤Þ¤¹: + + package Baz; + BEGIN { + require Foo; + require Bar; + push @ISA, qw(Foo Bar); + } + +=begin original + +When C<base> tries to C<require> a module, it will not die if it cannot find +the module's file, but will die on any other error. After all this, should +your base class be empty, containing no symbols, C<base> will die. This is +useful for inheriting from classes in the same file as yourself but where +the filename does not match the base module name, like so: + +=end original + +C<base> ¤¬¥â¥¸¥å¡¼¥ë¤ò C<require> ¤·¤è¤¦¤È¤·¤¿¤È¤¡¢¥â¥¸¥å¡¼¥ë¤Î¥Õ¥¡¥¤¥ë¤¬ +¸«¤Ä¤«¤é¤Ê¤¯¤Æ¤â die ¤·¤Þ¤»¤ó¡£ +¤·¤«¤·¤½¤Î¾¤Î¥¨¥é¡¼¤Ç¤Ï die ¤·¤Þ¤¹¡£ +¤³¤ì¤éÁ´¤Æ¤Î¸å¡¢´ðÄ쥯¥é¥¹¤¬¶õ¤Ç¡¢¥·¥ó¥Ü¥ë¤ò´Þ¤ó¤Ç¤¤¤Ê¤¤¾ì¹ç¡¢ +C<base> ¤Ï die ¤·¤Þ¤¹¡£ +¤³¤ì¤Ï¼¡¤Î¤è¤¦¤Ë¡¢¼«Ê¬¼«¿È¤ÇƱ¤¸¥Õ¥¡¥¤¥ë¤Ë¤¢¤ë¤±¤ì¤É¤â +¥Õ¥¡¥¤¥ë̾¤¬´ðÄì¥â¥¸¥å¡¼¥ë̾¤È°ìÃפ·¤Ê¤¤¥¯¥é¥¹¤«¤é·Ñ¾µ¤¹¤ë¤Î¤ËÍÍѤǤ¹: + + # in Bar.pm + package Foo; + sub exclaim { "I can have such a thing?!" } + + package Bar; + use base "Foo"; + +=begin original + +There is no F<Foo.pm>, but because C<Foo> defines a symbol (the C<exclaim> +subroutine), C<base> will not die when the C<require> fails to load F<Foo.pm>. + +=end original + +F<Foo.pm> ¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡¢C<Foo> ¤Ï¥·¥ó¥Ü¥ë (C<exclaim> ¥µ¥Ö¥ë¡¼¥Á¥ó) ¤ò +ÄêµÁ¤·¤Æ¤¤¤ë¤Î¤Ç¡¢C<base> ¤Ï C<require> ¤¬ F<Foo.pm> ¤ÎÆɤ߹þ¤ß¤Ë¼ºÇÔ¤·¤Æ¤â +die ¤·¤Þ¤»¤ó¡£ + +=begin original + +C<base> will also initialize the fields if one of the base classes has it. +Multiple inheritance of fields is B<NOT> supported, if two or more base classes +each have inheritable fields the 'base' pragma will croak. See L<fields> +for a description of this feature. + +=end original + +C<base> ¤Ï¤Þ¤¿¡¢´ðÄ쥯¥é¥¹¤Î¤¤¤º¤ì¤«¤¬»ý¤Ã¤Æ¤¤¤ë¥Õ¥£¡¼¥ë¥É¤ò½é´ü²½¤·¤Þ¤¹¡£ +¿½Å·Ñ¾µ¤ÏÂбþ¤·¤Æ B<¤¤¤Þ¤»¤ó>; Ê£¿ô¤Î´ðÄ쥯¥é¥¹¤¬¤½¤ì¤¾¤ì·Ñ¾µ²Äǽ¤Ê +¥Õ¥£¡¼¥ë¥É¤ò»ý¤Ã¤Æ¤¤¤ë¾ì¹ç¡¢'base' ¥×¥é¥°¥Þ¤Ï croak ¤·¤Þ¤¹¡£ +¤³¤Îµ¡Ç½¤ÎÀâÌÀ¤Ë¤Ä¤¤¤Æ¤Ï L<fields> ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ + +=begin original + +The base class' C<import> method is B<not> called. + +=end original + +´ðÄ쥯¥é¥¹¤Î C<import> ¥á¥½¥Ã¥É¤Ï B<¸Æ¤Ó½Ð¤µ¤ì¤Þ¤»¤ó>¡£ + +=head1 DIAGNOSTICS + +(¿ÇÃÇ¥á¥Ã¥»¡¼¥¸) + +=over 4 + +=item Base class package "%s" is empty. + +=begin original + +base.pm was unable to require the base package, because it was not +found in your path. + +=end original + +¥Ñ¥¹¤Ë¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¤Î¤Ç¡¢base.pm ¤Ï´ðÄì¥Ñ¥Ã¥±¡¼¥¸¤ò +require ¤Ç¤¤Þ¤»¤ó¤Ç¤·¤¿¡£ + +=item Class 'Foo' tried to inherit from itself + +=begin original + +Attempting to inherit from yourself generates a warning. + +=end original + +¼«Ê¬¼«¿È¤ò·Ñ¾µ¤·¤è¤¦¤È¤¹¤ë¤È·Ù¹ð¤¬½Ð¤Þ¤¹¡£ + + package Foo; + use base 'Foo'; + +=back + +=head1 HISTORY + +=begin original + +This module was introduced with Perl 5.004_04. + +=end original + +¤³¤Î¥â¥¸¥å¡¼¥ë¤Ï Perl 5.004_04 ¤ÇƳÆþ¤µ¤ì¤Þ¤·¤¿¡£ + +=head1 CAVEATS + +(Ãí°Õ) + +=begin original + +Due to the limitations of the implementation, you must use +base I<before> you declare any of your own fields. + +=end original + +¼ÂÁõ¾å¤ÎÀ©¸Â¤Ë¤è¤ê¡¢Æȼ«¤Î¥Õ¥£¡¼¥ë¥É¤òÀë¸À¤¹¤ë I<Á°¤Ë>use base ¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£ + +=head1 SEE ALSO + +L<fields> + +=begin meta + +Translate: SHIRAKATA Kentaro <argra****@ub32*****> +Status: completed + +=end meta + +=cut + Index: docs/modules/base-2.22/fields.pod diff -u /dev/null docs/modules/base-2.22/fields.pod:1.1 --- /dev/null Sun Dec 1 05:18:26 2019 +++ docs/modules/base-2.22/fields.pod Sun Dec 1 05:18:26 2019 @@ -0,0 +1,272 @@ + +=encoding euc-jp + +=head1 NAME + +=begin original + +fields - compile-time class fields + +=end original + +fields - ¥³¥ó¥Ñ¥¤¥ë»þ¤Î¥¯¥é¥¹¥Õ¥£¡¼¥ë¥É + +=head1 SYNOPSIS + + { + package Foo; + use fields qw(foo bar _Foo_private); + sub new { + my Foo $self = shift; + unless (ref $self) { + $self = fields::new($self); + $self->{_Foo_private} = "this is Foo's secret"; + } + $self->{foo} = 10; + $self->{bar} = 20; + return $self; + } + } + + my $var = Foo->new; + $var->{foo} = 42; + + # this will generate a run-time error + $var->{zap} = 42; + + # this will generate a compile-time error + my Foo $foo = Foo->new; + $foo->{zap} = 24; + + # subclassing + { + package Bar; + use base 'Foo'; + use fields qw(baz _Bar_private); # not shared with Foo + sub new { + my $class = shift; + my $self = fields::new($class); + $self->SUPER::new(); # init base fields + $self->{baz} = 10; # init own fields + $self->{_Bar_private} = "this is Bar's secret"; + return $self; + } + } + +=head1 DESCRIPTION + +=begin original + +The C<fields> pragma enables compile-time and run-time verified class +fields. + +=end original + +C<fields> ¥×¥é¥°¥Þ¤Ï¥³¥ó¥Ñ¥¤¥ë»þ¤ª¤è¤Ó¼Â¹Ô»þ¤Ë¤Ë¸¡¾Ú¤¹¤ë¥¯¥é¥¹¥Õ¥£¡¼¥ë¥É¤ò +͸ú¤Ë¤·¤Þ¤¹¡£ + +=begin original + +NOTE: The current implementation keeps the declared fields in the %FIELDS +hash of the calling package, but this may change in future versions. +Do B<not> update the %FIELDS hash directly, because it must be created +at compile-time for it to be fully useful, as is done by this pragma. + +=end original + +Ãí°Õ: ¸½ºß¤Î¼ÂÁõ¤Ï¸Æ¤Ó½Ð¤·¥Ñ¥Ã¥±¡¼¥¸¤Î %FIELDS ¥Ï¥Ã¥·¥å¤ËÀë¸À¤µ¤ì¤¿ +¥Õ¥£¡¼¥ë¥É¤òÊÝ»ý¤·¤Þ¤¹¤¬¡¢¤³¤ì¤Ï¾Íè¤Î¥Ð¡¼¥¸¥ç¥ó¤ÇÊѹ¹¤µ¤ì¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£ +%FIELDS ¥Ï¥Ã¥·¥å¤òľÀÜ B<¹¹¿·¤·¤Ê¤¤¤Ç¤¯¤À¤µ¤¤>; ¤Ê¤¼¤Ê¤é¡¢¤³¤ì¤¬´°Á´¤Ë +ÍÍѤǤ¢¤ë¤¿¤á¤Ë¡¢¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¤³¤Î¥×¥é¥°¥Þ¤¬¹Ô¤Ã¤¿¤È¤ª¤ê¤Î¤Þ¤Þ¤Ë +ºî¤é¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤«¤é¤Ç¤¹¡£ + +=begin original + +If a typed lexical variable (C<my Class +$var>) holding a reference is used to access a +hash element and a package with the same name as the type has +declared class fields using this pragma, then the hash key is +verified at compile time. If the variables are not typed, access is +only checked at run time. + +=end original + +¥ê¥Õ¥¡¥ì¥ó¥¹¤òÊÝ»ý¤·¤Æ¤¤¤ë·¿ÉÕ¤¥ì¥¥·¥«¥ëÊÑ¿ô (C<my Class $var>) ¤¬ +¥Ï¥Ã¥·¥åÍ×ÁǤΥ¢¥¯¥»¥¹¤Ë»È¤ï¤ì¡¢·¿¤ÈƱ¤¸Ì¾Á°¤Î¥Ñ¥Ã¥±¡¼¥¸¤¬¤³¤Î¥×¥é¥°¥Þ¤ò +»È¤Ã¤Æ¥¯¥é¥¹¥Õ¥£¡¼¥ë¥É¤òÀë¸À¤·¤Æ¤¤¤ë¤È¡¢¤³¤Î¥Ï¥Ã¥·¥å¥¡¼¤Ï¥³¥ó¥Ñ¥¤¥ë»þ¤Ë +¸¡¾Ú¤µ¤ì¤Þ¤¹¡£ +ÊÑ¿ô¤¬·¿ÉÕ¤¤Ç¤Ê¤¤¾ì¹ç¡¢¥¢¥¯¥»¥¹¤Ï¼Â¹Ô»þ¤Ë¤Î¤ß¥Á¥§¥Ã¥¯¤µ¤ì¤Þ¤¹¡£ + +=begin original + +The related C<base> pragma will combine fields from base classes and any +fields declared using the C<fields> pragma. This enables field +inheritance to work properly. Inherited fields can be overridden but +will generate a warning if warnings are enabled. + +=end original + +´ØÏ¢¤¹¤ë C<base> ¥×¥é¥°¥Þ¤Ï¡¢´ðÄ쥯¥é¥¹¤Î¥Õ¥£¡¼¥ë¥É¤È +C<fields> ¥×¥é¥°¥Þ¤ò»È¤Ã¤ÆÀë¸À¤µ¤ì¤¿¥Õ¥£¡¼¥ë¥É¤ò·ë¹ç¤·¤Þ¤¹¡£ +¤³¤ì¤Ë¤è¤ê¥Õ¥£¡¼¥ë¥É¤Î·Ñ¾µ¤¬Å¬ÀÚ¤ËÆ°ºî¤¹¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ +·Ñ¾µ¤µ¤ì¤¿¥Õ¥£¡¼¥ë¥É¤Ï¥ª¡¼¥Ð¡¼¥é¥¤¥É¤Ç¤¤Þ¤¹¤¬¡¢ +·Ù¹ð¤¬Í¸ú¤Ê¾ì¹ç¤Ï·Ù¹ð¤¬È¯À¸¤·¤Þ¤¹¡£ + +=begin original + +B<Only valid for Perl 5.8.x and earlier:> Field names that start with an +underscore character are made private to the class and are not visible +to subclasses. + +=end original + +B<Perl 5.8.x °ÊÁ°¤Ç¤Î¤ß͸ú:> +²¼Àþʸ»ú¤Ç»Ï¤Þ¤ë¥Õ¥£¡¼¥ë¥É̾¤Ï¤³¤Î¥¯¥é¥¹¤Ë¥×¥é¥¤¥Ù¡¼¥È¤Ê¤â¤Î¤È¤Ê¤ê¡¢ +¥µ¥Ö¥¯¥é¥¹¤«¤é¤Ï¸«¤¨¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£ + +=begin original + +Also, B<in Perl 5.8.x and earlier>, this pragma uses pseudo-hashes, the +effect being that you can have objects with named fields which are as +compact and as fast arrays to access, as long as the objects are +accessed through properly typed variables. + +=end original + +¤Þ¤¿¡¢B<Perl 5.8.x °ÊÁ°¤Ç¤Ï>¡¢¤³¤Î¥×¥é¥°¥Þ¤Ïµ¿»÷¥Ï¥Ã¥·¥å¤ò»È¤¤¡¢ +¤³¤Î¸ú²Ì¤Ï¡¢ÇÛÎó¤ÈƱÍͤ˥³¥ó¥Ñ¥¯¥È¤Ç¹â®¤Ê¡¢Ì¾Á°ÉÕ¤¥Õ¥£¡¼¥ë¥É¤ò +»ý¤Ä¥ª¥Ö¥¸¥§¥¯¥È¤ò»ý¤Æ¤ë¤³¤È¤Ç¤¹; +¤³¤ì¤Ï¥ª¥Ö¥¸¥§¥¯¥È¤¬Å¬Àڤ˷¿ÉÕ¤±¤µ¤ì¤¿ÊÑ¿ô¤òÄ̤·¤Æ¥¢¥¯¥»¥¹¤µ¤ì¤¿¾ì¹ç¤Ë¤Î¤ß +Æ°ºî¤·¤Þ¤¹¡£ + +=begin original + +The following functions are supported: + +=end original + +°Ê²¼¤Î´Ø¿ô¤ËÂбþ¤·¤Æ¤¤¤Þ¤¹: + +=over 4 + +=item new + +=begin original + +fields::new() creates and blesses a hash comprised of the fields declared +using the C<fields> pragma into the specified class. It is the +recommended way to construct a fields-based object. + +=end original + +fields::new() ¤Ï +C<fields> ¥×¥é¥°¥Þ¤ò»È¤Ã¤ÆÀë¸À¤µ¤ì¤¿¥Õ¥£¡¼¥ë¥É¤«¤é¤Ê¤ë¥Ï¥Ã¥·¥å¤ò +»ØÄꤵ¤ì¤¿¥¯¥é¥¹¤ËºîÀ®¤·¤Æ¡¢bless ¤·¤Þ¤¹¡£ +¤³¤ì¤Ï fields ¥Ù¡¼¥¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¤¿¤á¤Î¿ä¾©¤¹¤ëÊýË¡¤Ç¤¹¡£ + +=begin original + +This makes it possible to write a constructor like this: + +=end original + +¤³¤ì¤Ï¼¡¤Î¤è¤¦¤Ê¥³¥ó¥¹¥È¥é¥¯¥¿¤ò½ñ¤¯¤³¤È¤ò²Äǽ¤Ë¤·¤Þ¤¹: + + package Critter::Sounds; + use fields qw(cat dog bird); + + sub new { + my $self = shift; + $self = fields::new($self) unless ref $self; + $self->{cat} = 'meow'; # scalar element + @$self{'dog','bird'} = ('bark','tweet'); # slice + return $self; + } + +=item phash + +=begin original + +B<This function only works in Perl 5.8.x and earlier.> Pseudo-hashes +were removed from Perl as of 5.10. Consider using restricted hashes or +fields::new() instead (which itself uses restricted hashes under 5.10+). +See L<Hash::Util>. Using fields::phash() under 5.10 or higher will +cause an error. + +=end original + +B<¤³¤Î´Ø¿ô¤Ï Perl 5.8.x °ÊÁ°¤Ç¤Î¤ßÆ°ºî¤·¤Þ¤¹¡£> +µ¿»÷¥Ï¥Ã¥·¥å¤Ï 5.10 ¤Ç Perl ¤«¤é¼è¤ê½ü¤«¤ì¤Þ¤·¤¿¡£ +Âå¤ï¤ê¤ËÀ©¸Â¥Ï¥Ã¥·¥å¤ä¡¢(¤³¤ì¼«¿È 5.10+¤Ç¤ÏÀ©¸Â¥Ï¥Ã¥·¥å¤ò»È¤Ã¤Æ¤¤¤ë) +fields::new() ¤ò»È¤¦¤³¤È¤ò¸¡Æ¤¤·¤Æ¤¯¤À¤µ¤¤¡£ +L<Hash::Util> ¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ +5.10 °Ê¹ß¤Ç fields::phash() ¤ò»È¤¦¤È¥¨¥é¡¼¤Ë¤Ê¤ê¤Þ¤¹¡£ + +=begin original + +fields::phash() can be used to create and initialize a plain (unblessed) +pseudo-hash. This function should always be used instead of creating +pseudo-hashes directly. + +=end original + +fields::phash() ¤ÏÄ̾ï¤Î(bless ¤µ¤ì¤Æ¤¤¤Ê¤¤) +µ¿»÷¥Ï¥Ã¥·¥å¤ÎºîÀ®¤È½é´ü²½¤Ë»È¤ï¤ì¤Þ¤¹¡£ +¤³¤Î´Ø¿ô¤Ïµ¿»÷¥Ï¥Ã¥·¥å¤òľÀܺî¤ëÂå¤ï¤ê¤Ë¾ï¤Ë»È¤ï¤ì¤ë¤Ù¤¤Ç¤¹¡£ + +=begin original + +If the first argument is a reference to an array, the pseudo-hash will +be created with keys from that array. If a second argument is supplied, +it must also be a reference to an array whose elements will be used as +the values. If the second array contains less elements than the first, +the trailing elements of the pseudo-hash will not be initialized. +This makes it particularly useful for creating a pseudo-hash from +subroutine arguments: + +=end original + +ºÇ½é¤Î°ú¿ô¤¬ÇÛÎó¤Ø¤Î¥ê¥Õ¥¡¥ì¥ó¥¹¤Î¾ì¹ç¡¢µ¿»÷¥Ï¥Ã¥·¥å¤Ï¤³¤ÎÇÛÎó¤ò +¥¡¼¤È¤·¤ÆºîÀ®¤µ¤ì¤Þ¤¹¡£ +2 ÈÖÌܤΰú¿ô¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¡¢¤³¤ì¤ÏÍ×ÁǤ¬ÃͤȤ·¤Æ»È¤ï¤ì¤ëÇÛÎó¤Ø¤Î +¥ê¥Õ¥¡¥ì¥ó¥¹¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£ +Æó¤ÄÌܤÎÇÛÎó¤ÎÍ×ÁÇ¿ô¤¬°ì¤ÄÌܤè¤ê¾¯¤Ê¤¤¾ì¹ç¡¢ +µ¿»÷¥Ï¥Ã¥·¥å¤Î»Ä¤ê¤ÎÍ×ÁǤϽé´ü²½¤µ¤ì¤Þ¤»¤ó¡£ +¤³¤ì¤ÏÆä˥µ¥Ö¥ë¡¼¥Á¥ó¤Î°ú¿ô¤«¤éµ¿»÷¥Ï¥Ã¥·¥å¤òºîÀ®¤¹¤ë¤Î¤ËÍÍѤǤ¹: + + sub dogtag { + my $tag = fields::phash([qw(name rank ser_num)], [@_]); + } + +=begin original + +fields::phash() also accepts a list of key-value pairs that will +be used to construct the pseudo hash. Examples: + +=end original + +fields::phash() ¤Ï¤Þ¤¿¡¢µ¿»÷¥Ï¥Ã¥·¥å¤ò¹½ÃÛ¤¹¤ë¤Î¤Ë»È¤ï¤ì¤ë +¥¡¼-ÃͤÎÁȤΥꥹ¥È¤â¼õ¤±ÉÕ¤±¤Þ¤¹¡£ +Îã: + + my $tag = fields::phash(name => "Joe", + rank => "captain", + ser_num => 42); + + my $pseudohash = fields::phash(%args); + +=back + +=head1 SEE ALSO + +L<base>, L<Hash::Util> + +=begin meta + +Translate: SHIRAKATA Kentaro <argra****@ub32*****> +Status: completed + +=end meta + +=cut +