9cf060bf3250d0b6fecb9cd6376eef5bac00f868
[catagits/HTML-Zoom.git] / lib / HTML / Zoom / ZConfig.pm
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;