Perlersを助けてください!単純な「ここにコードを挿入」アプローチでは、コンパイル時に外部ファイルからコードをパッケージに取り込むことを知っている人はいますか?
バックグラウンド:
私は標準的なPBPスタイルの裏返しのクラスを持っていますが、それはかなり大きくなっています。コードを複数のファイルに分割したいのですが、クラスを拡張したくありません。最適には、コンパイル時に1回、サンプルモジュール(以下を参照)の「MagicJuJu」セクションにコードを挿入するだけです。
私はこれを達成するための手段としてAutoLoaderを見てきました。しかし、私に一時停止を与える2つのことがあります。これらを回避できれば、ほぼ最適な解決策になる可能性があります。
すべての小さなサブを個別のファイルに分割したくありません。適度なサイズのファイルをいくつか追加します(ただし、呼び出し元でサブスタブを使用することは問題ありません)。と
すべてのサブでコンパイルを延期したくありません。私が最初の使用でコンパイルしたいいくつかの潜水艦。ただし、これはおそらく取引を妨げるものではありません。
Mooseが「役割」を提供していることは知っていますが、これはうまくいくと思いますが、さまざまな理由から、Mooseはこのプロジェクトのオプションではなく、Mouseもありません。
「MagicJuJu」の場所で「requireq(some / file)」を使用しましたが、永続変数のスコープが維持されていません。つまり、外部ファイルのサブがオブジェクト属性のハッシュを正しく「認識」していません(まだつまり、requireをファイルの先頭に置くと同じ効果があります)。私は常にセッターとゲッターを使用することでそれを回避することができました。したがって、これは取引を妨げるものではありませんが、コーディング時間と実行オーバーヘッドが少し必要になるため、私は負担しません。
最後に、クラスを拡張したくありません。すでに多重継承があります。単純な「ここにコードを挿入」アプローチで、コンパイル時にコードを1回取り込むだけです。
要約すれば:
- (必須)外部ファイルからパッケージ名前空間にコードをインポートします
- (必須)コンパイル時または最小限の実行時オーバーヘッドでのみ実行します
- (必須)クラスを拡張しません
- (望ましい)名誉はロケーションスコープを挿入します
以下の「MagicJuJu」コメント付きのサンプルコード:
package T;
use strict;
use warnings;
########## BEGIN object persistent variables scope block ############
{
my %Attr_Name_Env;
## Constructor 'new'
#
sub new {
## Get and confirm arguments
#
my $class = shift;
my $href_arg = {@_};
my $name_env = $href_arg->{'name_env'};
## Bless anon scalar into class
#
my $obj_new = bless anon_scalar(), $class;
my $idx_self = ident $obj_new;
# Populate object attributes
#
$Attr_Name_Env{ $idx_self } = $name_env;
return $obj_new;
}
## END Constructor 'new'
sub DESTROY {... as you do ...}
sub t_get_name_env {
my $self = shift;
my $idx_self = ident $self;
return $Attr_Name_Env{ $idx_self };
}
## insert magic juju here
}
########## END object persistent variables scope block ############
1;
たぶん、丸呑みと評価のあるBEGINブロック...