ねもぷらす

ふぁいんでぃんぐねもの日記。プログラミングとか育児とか

共通な処理をまとめたい

ずっとスーパークラスに共通処理をまとめて書いてたけど、↓なやり方でも可能だったメモ。

  • ツール
use strict;
use lib qw(./);
use File::Test;
use Data::Dumper;

my $test = File::Test->new();

my @work = qw( aaa bbb );
foreach ( @work ) {
   my $cmd = "create_" . $_;
   $test->$cmd;
}

print Dumper $test;
  • File::Test
package File::Test;
use strict;

use base qw(
   File::AAA
   File::BBB
);

sub new {
    return bless { }, shift;
}

sub create {
    my $self = shift;
    my $from_package = shift;
    print __PACKAGE__ ."->create! ( 実行元は$from_package )\n";
    return 1;
}

1;
__END__
  • File::AAA
package File::AAA;
use strict;

use vars qw( $namespace );
$namespace = 'aaa';

sub create_aaa {
    my $self = shift;
    $self->create( __PACKAGE__ );
    $self->{ $namespace } = "I am aaaa";
    return 1;
}

1;
__END__
  • File::BBB
package File::BBB;
use strict;

use vars qw( $namespace );
$namespace = 'bbb';

sub create_aaa {
    my $self = shift;
    $self->create( __PACKAGE__ );
    $self->{ $namespace } = "I am bbbb";
    return 1;
}

1;
__END__


実行結果

File::Test->create! ( 実行元はFile::AAA )
File::Test->create! ( 実行元はFile::BBB )
$VAR1 = bless( {
                 'bbb' => 'I am bbbb',
                 'aaa' => 'I am aaaa'
               }, 'File::Test' );