Commit | Line | Data |
d80786d0 |
1 | package HTML::Zoom::ZConfig; |
2 | |
3 | use strict; |
4 | use warnings FATAL => 'all'; |
5 | |
6 | my %DEFAULTS = ( |
7 | parser => 'HTML::Zoom::Parser::BuiltIn', |
8 | producer => 'HTML::Zoom::Producer::BuiltIn', |
9 | filter_builder => 'HTML::Zoom::FilterBuilder', |
10 | selector_parser => 'HTML::Zoom::SelectorParser', |
11 | stream_utils => 'HTML::Zoom::StreamUtils', |
12 | ); |
13 | |
14 | my $ALL_DEFAULT; |
15 | |
16 | sub new { |
17 | my ($class, $args) = @_; |
18 | return $ALL_DEFAULT if $ALL_DEFAULT && !keys %{$args||{}}; |
19 | my $new = {}; |
20 | foreach my $arg_name (keys %DEFAULTS) { |
21 | $new->{$arg_name} = $args->{$arg_name} || $DEFAULTS{$arg_name}; |
22 | if (ref($new->{$arg_name})) { |
23 | $new->{$arg_name} = $new->{$arg_name}->with_zconfig($new); |
24 | } else { |
25 | require(do { (my $m = $new->{$arg_name}) =~ s/::/\//g; "${m}.pm" }); |
26 | $new->{$arg_name} = $new->{$arg_name}->new({ zconfig => $new }); |
27 | } |
28 | } |
29 | $ALL_DEFAULT = $new if !keys %{$args||{}}; |
30 | bless($new, $class); |
31 | } |
32 | |
33 | sub parser { shift->{parser} } |
34 | sub producer { shift->{producer} } |
35 | sub filter_builder { shift->{filter_builder} } |
36 | sub selector_parser { shift->{selector_parser} } |
37 | sub stream_utils { shift->{stream_utils} } |
38 | |
39 | 1; |