这是(希望如此!)基于 OO 的配置抽象的简单示例,使用:
注意。您可以使用其他模块,甚至可以使用自己的模块。以下仅作为一般示例。
RoomConfig.pm
package RoomConfig;
use Moose;
with 'MooseX::SimpleConfig';
has doors => (is => 'rw', isa => 'Int', required => 1);
has windows => (is => 'rw', isa => 'Int', default => sub {0});
1;
以上就是我们的 OO 配置类。一切都被整齐地声明,因此您清楚地知道配置选项可用且有效,即。它的自我记录。
因此,从配置文件创建一个room
将是:
use RoomConfig;
my $box_room = RoomConfig->new_with_config( configfile => 'box_room.yaml' );
因为它是一个类,所以我也可以在room
没有配置文件的情况下实例化 a:
my $cupboard = RoomConfig->new( doors => 1 );
my $utility_room = RoomConfig->new( doors => 2 );
my $master_bedroom = RoomConfig->new(
doors => 1,
windows => 2, # dual aspect
);
此外,通过这些特定模块,我们可以获得如下额外功能:
# below throws exception because room must have a door!
my $room_with_no_door_or_window = RoomConfig->new;
因此,我的配置可以很容易地来自配置文件或通过设置属性。
我们可以通过为不同类型扩展我们的配置来走得更远rooms
:
浴室配置.pm
package BathRoomConfig;
use Moose;
extends 'RoomConfig';
has loos => (is => 'rw', isa => 'Int', default => sub {0});
has sinks => (is => 'rw', isa => 'Int', default => sub {0});
has baths => (is => 'rw', isa => 'Int', default => sub {1});
1;
如果我们使用这个配置(bathroom.yaml):
doors: 1
windows: 1
bath: 1
loos: 1
sinks: 2
然后你可以这样做:
use BathRoomConfig;
my $upstairs_bathroom = BathRoomConfig->new_with_config(
configfile => 'bathroom.yaml'
);
my $closet_room = BathRoomConfig->new_with_config(
configfile => 'bathroom.yaml',
baths => 0,
sinks => 1,
windows => 0,
);
请注意,$closet_room
它同时使用了配置文件和设置属性。
另请注意,如果我的配置文件没有doors
(即必需的属性),那么它会在new_with_config
.
最后,我们可能会发现自省我们定义的配置类很方便:
use RoomConfig;
say "RoomConfig provides the following options:";
for my $attr (RoomConfig->meta->get_attribute_list) {
next if $attr eq 'configfile';
say '-> ', $attr;
}
现在没有什么能阻止您在标准配置包中实现大部分内容,所以归根结底,它只是课程的马!
然而,使用 OO 可以轻松管理所有这一切,并且这些已经编写的模块提供的功能具有很大的优势,尤其是在更大的项目中。