Config-Model

 view release on metacpan or  search on metacpan

lib/Config/Model/Instance.pm  view on Meta::CPAN

    foreach my $path ( sort $self->nodes_to_write_back ) {
        $logger->info("write_back called on node $path");

        if ( $path and $self->{config_file} ) {
            $logger->warn("write_back: cannot override config_file in non root node ($path)");
            delete  $self->{config_file}
        }

        $self->_write_back_node(%args, path => $path, force_write => $force_write) ;
    }
    $self->clear_changes;
    return;
}

sub _write_back_node ($self, %args) {
    my $path = delete $args{path};
    my $force_write   = delete $args{force_write};

    my $node = $self->config_root->grab(
        step => $path,
        type => 'node',
        mode => 'loose',
        autoadd => 0,
    );

    foreach my $wb_info (@{ $self->write_back_node_info($path) }) {
        my ($backend, $cb) = @$wb_info;

        my @wb_args = (
            %args,
            config_file   => $self->{config_file},
            force         => $force_write,
            backup        => $self->backup,
        );

        if (defined $node and ($node->needs_save or $force_write)) {
            my $dir = $args{config_dir};
            mkpath( $dir, 0, oct(755) ) if $dir and not -d $dir;

            # exit when write is successfull
            my $res = $cb->(@wb_args);
            $logger->info( "write_back called with $backend backend, result is ",
                           defined $res ? $res : '<undef>' );
        }

        if (not defined $node) {
            $logger->debug("deleting file for deleted node $path");
            $cb->(@wb_args, force_delete => 1);
            $self->delete_write_back($path);
        }
    }

    $logger->trace( "write_back on node '$path' done" );
    return;
}

sub save {
    goto &write_back;
}

sub update {
    my ($self, %args) = @_;

    my $hook = sub {
        my ($scanner, $data_ref,$node,@element_list) = @_;
        if ($node->can('update')) {
            my $loc = $node->location;
            say "Calling update on node '$loc'" if $loc and not $args{quiet};
            push (@$data_ref, $node->update(%args))
        } ;
    };

    my $leaf_cb = sub ($scanner, $data_ref,$node,$element_name,$index, $leaf_object) {
        push @$data_ref, $leaf_object->update_from_file();
    };

    my $root = $self->config_root ;

    my @msgs ;
    Config::Model::ObjTreeScanner->new(
        node_content_hook => $hook,
        check => ($args{quiet} ? 'no' : 'yes'),
        leaf_cb => $leaf_cb,
        file_value_cb => $leaf_cb,
        dir_value_cb => $leaf_cb,
    )->scan_node( \@msgs, $root );

    return @msgs;
}

sub DEMOLISH {
    my $self = shift;
    $self->clear_write_back; # avoid reference loops
    return;
}

__PACKAGE__->meta->make_immutable;

1;

# ABSTRACT: Instance of configuration tree

__END__

=pod

=encoding UTF-8

=head1 NAME

Config::Model::Instance - Instance of configuration tree

=head1 VERSION

version 2.162

=head1 SYNOPSIS

 use Config::Model;
 use File::Path ;



( run in 0.618 second using v1.01-cache-2.11-cpan-39bf76dae61 )