Perl 5.004に現れた標準モジュールの new メソッドを集めてみました。息切れしてIまでしか、行けませんでした。new メソッドのない標準モジュールも結構多いようです。
最も単純なnew()
sub new {
my $self = {}
bless( $self );
return $self;
}
パラメータを引数としてとるnew()
sub new {
my $class = shift;
my $self = {};
%$self = @_;
bless( $self );
return $self;
}
利用法
use Class;
$object = new Class( NAME1=>data1, NAME2=>data2, ..);
パラメータを引数としてとるが、defaultの値も設定しておけるnew()
sub new {
my $class = shift;
my $self = {};
bless( $self, $class );
$self->{ATTRIBUTE_1} = 'default';
my %hash = @_;
foreach $key ( keys( %hash ) ) {
$self->{ $key } = %hash{ $key }
}
return $self;
}
継承をできるようにしたnew()
sub new {
my $class = shift;
my $self = {};
bless( $self, $class );
return $self;
}
利用法(子クラス)
use ParentClass;
@ISA = qw( ParentClass );
利用法(プログラム本体)
use ChildClass;
$object = ChildClass->new();
クローニングのできるnew()
sub new {
my $param = shift;
my $class = ref( $param ) || $param;
my $self = {};
bless( $self, $class );
return $self;
}
利用法
use Class;
$object1 = new Class;
$object2 = $object1->new();
package CGI;
sub new {
my($class,$initializer) = @_;
my $self = {};
bless $self,ref $class || $class || $DefaultClass;
$CGI::DefaultClass->_reset_globals() if $MOD_PERL;
$initializer = to_filehandle($initializer) if $initializer;
$self->init($initializer);
return $self;
}
package CGI::Fast;
sub new {
return undef unless FCGI::accept() >= 0;
my($self,@param) = @_;
return $CGI::Q = $self->SUPER::new(@param);
}
package CGI::Switch;
sub new {
shift;
my($file,$pack);
for $pack (@Pref) {
($file = $pack) =~ s|::|/|g;
eval { require "$file.pm"; };
if ($@) {
#XXX warn $@;
next;
} else {
#XXX warn "Going to try $pack\->new\n";
my $obj;
eval {$obj = $pack->new(@_)};
if ($@) {
#XXX warn $@;
} else {
return $obj;
}
}
}
Carp::croak "Couldn't load+construct any of @Pref\n";
}
package Class::Struct;
$out = "{\n package $class;\n use Carp;\n sub new {\n";
my $cnt = 0;
my $idx = 0;
my( $cmt, $name, $type, $elem );
if( $base_type eq 'HASH' ){
$out .= " my(\$r) = {};\n";
$cmt = '';
}
elsif( $base_type eq 'ARRAY' ){
$out .= " my(\$r) = [];\n";
}
package CPAN;
sub new {
bless {}, shift;
}
package CPAN::Mirrored::By;
sub new {
my($self,@arg) = @_;
bless [@arg], $self;
}
package DirHandle;
sub new {
@_ >= 1 && @_ <= 2 or croak 'usage: new DirHandle [DIRNAME]';
my $class = shift;
my $dh = gensym;
if (@_) {
DirHandle::open($dh, $_[0])
or return undef;
}
bless $dh, $class;
}
package ExtUtils::Install::Warn;
sub new { bless {}, shift }
package I18N::Collate;
sub new {
my $new = $_[1];
if ($^W && $] >= 5.003_06) {
unless ($please_use_I18N_Collate_even_if_deprecated) {
warn <<___EOD___;
***
WARNING: starting from the Perl version 5.003_06
the I18N::Collate interface for comparing 8-bit scalar data
according to the current locale
HAS BEEN DEPRECATED
That is, please do not use it anymore for any new applications
and please migrate the old applications away from it because its
functionality was integrated into the Perl core language in the
release 5.003_06.
See the perllocale manual page for further information.
***
___EOD___
$please_use_I18N_Collate_even_if_deprecated++;
}
}
bless \$new;
}