1 package System::Introspector::Report::Source;
5 use Module::Runtime qw( use_module );
7 my $_json = JSON::PP->new->utf8->relaxed->allow_nonref;
9 has root => (is => 'ro', required => 1);
12 my ($class, $root, @args) = @_;
13 if ($root =~ m{^(.+):(.+)$}) {
14 my ($remote, $remote_root) = ($1, $2);
15 require Object::Remote;
16 return $class->new::on($remote, @args, root => $remote_root);
19 return $class->new(@args, root => $root);
24 my ($self, @types) = @_;
25 my @generators = map { $self->_make_generator($_) } @types;
26 my $required = +{ map { ($_ => 1) } map $_->required_data, @generators };
27 my @dirs = $self->_find_source_dirs;
28 for my $dir_spec (@dirs) {
29 my ($id, $path) = @$dir_spec;
30 my $data = $self->_load_dataset($path, $required)
32 $_->collect_from($id, $data)
35 return map { ($_->render_reports) } @generators;
39 my ($self, $path, $required) = @_;
40 my $root = $self->root;
43 ($_->[0], $_json->decode(scalar $_->[1]->slurp) || {});
48 $key =~ s!^\Q$root\E/*(?:[^/]+/+){2}!!;
52 not(m{^\.}) and m{\.json$};
53 } $path->deep->all_files
57 sub _find_source_dirs {
59 my $root = $self->root;
61 (my $id = $_) =~ s{^\Q$root\E/*}{};
63 } io($root)->all_dirs;
67 my ($self, $spec) = @_;
68 my ($type, $args) = @$spec;
69 return use_module("System::Introspector::Report::Builder::$type")