【发布时间】:2010-02-17 16:21:09
【问题描述】:
帮助佩勒斯!有谁知道一个简单的“在此处插入代码”方法会在编译时将外部文件中的代码一次带入包中?
背景:
我有一个标准的 PBP 风格的由内而外的类,它变得非常大。我想将代码拆分为多个文件,但不扩展类。最理想的情况是,我只需在编译时将代码插入示例模块的“Magic JuJu”部分(见下文)。
我已将 AutoLoader 视为完成此任务的一种手段。但是,有两件事让我停下来。如果我能解决这些问题,它可能是一个近乎最佳的解决方案:
我不想将每个小子拆分成一个单独的文件;只是一些更合理大小的文件(尽管在调用者中使用子存根很好);和
我不想在每个子节点上都推迟编译;我想在初次使用时编译一些潜艇。但是,这可能不会破坏交易。
我知道 Moose 提供了“角色”,我相信它做得很好,但由于各种原因,Moose 不是这个项目的一个选项,Moose 也不是。
我在“Magic JuJu”位置使用了“require q(some/file)”,但这并不能保持持久变量范围,即来自外部文件的子不会“看到”正确的对象属性散列(换句话说,将 require 放在文件的顶部会产生相同的效果)。我可以通过始终使用 setter 和 getter 来解决这个问题。所以这不是一个交易破坏者,但需要一些我不想承担的编码时间和执行开销。
最后,我不想扩展类;它已经具有多重继承。我只想要一个简单的“在此处插入代码”方法会在编译时将代码引入一次。
总结:
- (必需)将代码从外部文件导入包命名空间
- (必需)仅在编译时或最小运行时开销时这样做
- (必需)不扩展类
- (期望)荣誉插入位置范围
下面带有“Magic JuJu”注释的示例代码:
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;
也许是一个带有 slurp 和 eval 的 BEGIN 块......
【问题讨论】:
-
你为什么关心班级人数?
标签: perl perl-module