[libconfig-model-perl] 01/04: New upstream version 2.117

dod at debian.org dod at debian.org
Mon Feb 19 17:56:13 UTC 2018


This is an automated email from the git hooks/post-receive script.

dod pushed a commit to annotated tag debian/2.117-1
in repository libconfig-model-perl.

commit 3f4ce7ba84d845dcca80ed9b2cd7252d5720d8c9
Author: Dominique Dumont <dod at debian.org>
Date:   Mon Feb 19 18:49:20 2018 +0100

    New upstream version 2.117
---
 Build.PL                                           |  2 +-
 Changes                                            |  6 +++
 LICENSE                                            |  2 +-
 META.json                                          |  2 +-
 META.yml                                           |  2 +-
 lib/Config/Model.pm                                |  8 ++--
 lib/Config/Model/Annotation.pm                     |  8 ++--
 lib/Config/Model/AnyId.pm                          |  9 ++--
 lib/Config/Model/AnyThing.pm                       |  8 ++--
 lib/Config/Model/Backend/Any.pm                    |  8 ++--
 lib/Config/Model/Backend/CdsFile.pm                |  8 ++--
 lib/Config/Model/Backend/Fstab.pm                  |  8 ++--
 lib/Config/Model/Backend/IniFile.pm                |  8 ++--
 lib/Config/Model/Backend/Json.pm                   |  8 ++--
 lib/Config/Model/Backend/PerlFile.pm               |  8 ++--
 lib/Config/Model/Backend/PlainFile.pm              | 27 +++++------
 lib/Config/Model/Backend/ShellVar.pm               |  8 ++--
 lib/Config/Model/Backend/Yaml.pm                   |  8 ++--
 lib/Config/Model/BackendMgr.pm                     | 49 +++++++++-----------
 lib/Config/Model/BackendTrackOrder.pm              |  8 ++--
 lib/Config/Model/CheckList.pm                      |  8 ++--
 lib/Config/Model/Cookbook/CreateModelFromDoc.pod   |  4 +-
 lib/Config/Model/Describe.pm                       |  8 ++--
 lib/Config/Model/DumpAsData.pm                     |  8 ++--
 lib/Config/Model/Dumper.pm                         |  8 ++--
 lib/Config/Model/Exception.pm                      | 54 ++++++++++++----------
 lib/Config/Model/FuseUI.pm                         |  8 ++--
 lib/Config/Model/HashId.pm                         |  9 ++--
 lib/Config/Model/IdElementReference.pm             |  8 ++--
 lib/Config/Model/Instance.pm                       |  8 ++--
 lib/Config/Model/Iterator.pm                       |  8 ++--
 lib/Config/Model/ListId.pm                         |  8 ++--
 lib/Config/Model/Lister.pm                         |  8 ++--
 lib/Config/Model/Loader.pm                         |  8 ++--
 lib/Config/Model/Manual/ModelCreationAdvanced.pod  |  4 +-
 .../Model/Manual/ModelCreationIntroduction.pod     |  4 +-
 lib/Config/Model/Node.pm                           |  8 ++--
 lib/Config/Model/ObjTreeScanner.pm                 |  8 ++--
 lib/Config/Model/Report.pm                         |  8 ++--
 lib/Config/Model/Role/ComputeFunction.pm           |  8 ++--
 lib/Config/Model/Role/FileHandler.pm               | 21 +++++----
 lib/Config/Model/Role/Grab.pm                      |  8 ++--
 lib/Config/Model/Role/HelpAsText.pm                |  8 ++--
 lib/Config/Model/Role/NodeLoader.pm                |  8 ++--
 lib/Config/Model/Role/WarpMaster.pm                |  8 ++--
 lib/Config/Model/SearchElement.pm                  |  8 ++--
 lib/Config/Model/SimpleUI.pm                       |  8 ++--
 lib/Config/Model/TermUI.pm                         |  8 ++--
 lib/Config/Model/TreeSearcher.pm                   |  8 ++--
 lib/Config/Model/Utils/GenClassPod.pm              |  8 ++--
 lib/Config/Model/Value.pm                          |  8 ++--
 lib/Config/Model/Value/LayeredInclude.pm           |  8 ++--
 lib/Config/Model/ValueComputer.pm                  |  8 ++--
 lib/Config/Model/WarpedNode.pm                     |  8 ++--
 lib/Config/Model/Warper.pm                         |  8 ++--
 lib/Config/Model/models/Fstab.pl                   |  2 +-
 lib/Config/Model/models/Fstab/CommonOptions.pl     |  2 +-
 lib/Config/Model/models/Fstab/Ext2FsOpt.pl         |  2 +-
 lib/Config/Model/models/Fstab/Ext3FsOpt.pl         |  2 +-
 lib/Config/Model/models/Fstab/Ext4FsOpt.pl         |  2 +-
 lib/Config/Model/models/Fstab/FsLine.pl            |  2 +-
 lib/Config/Model/models/Fstab/Iso9660_Opt.pl       |  2 +-
 lib/Config/Model/models/Fstab/NoneOptions.pl       |  2 +-
 lib/Config/Model/models/Fstab/SwapOptions.pl       |  2 +-
 lib/Config/Model/models/Fstab/UsbFsOptions.pl      |  2 +-
 lib/Config/Model/models/Multistrap.pl              |  2 +-
 lib/Config/Model/models/Multistrap/Section.pl      |  2 +-
 lib/Config/Model/models/PopCon.pl                  |  2 +-
 t/annotation.t                                     |  2 +-
 t/array_id.t                                       |  2 +-
 t/hash_id_of_values.t                              |  3 +-
 t/lib/Config/Model/models/Master.pl                |  2 +-
 t/lib/DummyNode.pm                                 |  2 +-
 t/lib/MyTestLib.pm                                 |  2 +-
 t/lib/dump_load_model.pm                           |  2 +-
 t/lib/test_ini_backend_model.pl                    |  2 +-
 t/lib/test_yaml_model.pl                           |  2 +-
 t/model_tests.d/backend-cds-test-conf.pl           |  2 +-
 t/model_tests.d/backend-ini-test-conf.pl           |  2 +-
 t/model_tests.d/backend-json-test-conf.pl          |  2 +-
 t/model_tests.d/backend-key-value-test-conf.pl     |  2 +-
 t/model_tests.d/backend-perl-test-conf.pl          |  2 +-
 t/model_tests.d/backend-plainfile-test-conf.pl     |  2 +-
 t/model_tests.d/backend-shellvar-test-conf.pl      |  2 +-
 t/model_tests.d/backend-yaml-data-test-conf.pl     |  2 +-
 t/model_tests.d/backend-yaml-test-conf.pl          |  2 +-
 t/model_tests.d/fstab-test-conf.pl                 |  2 +-
 .../layer-examples/mini/etc/foo-config.pl          |  2 +-
 .../layer-examples/mini/home/joe/foo/config.pl     |  2 +-
 t/model_tests.d/layer-test-conf.pl                 |  2 +-
 t/model_tests.d/multi-ini-test-conf.pl             |  2 +-
 t/model_tests.d/multistrap-test-conf.pl            |  2 +-
 t/model_tests.d/popcon-test-conf.pl                |  2 +-
 t/value.t                                          |  2 +-
 t/value_compute.t                                  |  2 +-
 95 files changed, 307 insertions(+), 297 deletions(-)

diff --git a/Build.PL b/Build.PL
index c67da85..18d00a7 100644
--- a/Build.PL
+++ b/Build.PL
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/Changes b/Changes
index 553f997..9206a87 100644
--- a/Changes
+++ b/Changes
@@ -1,3 +1,9 @@
+2.117 2018-02-03
+
+  Bug fixes:
+    * notify about addition of hash key only when needed
+    * fix error message of "missing file" exception
+
 2.116 2017-12-15
 
   Fix broken cme:
diff --git a/LICENSE b/LICENSE
index 753e43a..842cbe0 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/META.json b/META.json
index 440322e..95aa01b 100644
--- a/META.json
+++ b/META.json
@@ -96,7 +96,7 @@
          "web" : "http://github.com/dod38fr/config-model"
       }
    },
-   "version" : "2.116",
+   "version" : "2.117",
    "x_serialization_backend" : "JSON::XS version 3.04"
 }
 
diff --git a/META.yml b/META.yml
index 6b982b0..bca22ad 100644
--- a/META.yml
+++ b/META.yml
@@ -67,5 +67,5 @@ resources:
   bugtracker: https://github.com/dod38fr/config-model/issues
   homepage: https://github.com/dod38fr/config-model/wiki
   repository: git://github.com/dod38fr/config-model.git
-version: '2.116'
+version: '2.117'
 x_serialization_backend: 'YAML::Tiny version 1.70'
diff --git a/lib/Config/Model.pm b/lib/Config/Model.pm
index 78e4afa..64c8114 100644
--- a/lib/Config/Model.pm
+++ b/lib/Config/Model.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model;
-$Config::Model::VERSION = '2.116';
+$Config::Model::VERSION = '2.117';
 use strict ;
 use warnings;
 use 5.10.1;
@@ -1846,7 +1846,7 @@ Config::Model - Create tools to validate, migrate and edit configuration files
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -2882,7 +2882,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Annotation.pm b/lib/Config/Model/Annotation.pm
index e9b355f..1ef472b 100644
--- a/lib/Config/Model/Annotation.pm
+++ b/lib/Config/Model/Annotation.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Annotation;
-$Config::Model::Annotation::VERSION = '2.116';
+$Config::Model::Annotation::VERSION = '2.117';
 use Mouse;
 use English;
 
@@ -164,7 +164,7 @@ Config::Model::Annotation - Read and write configuration annotations
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -283,7 +283,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/AnyId.pm b/lib/Config/Model/AnyId.pm
index 0501ad4..7236d10 100644
--- a/lib/Config/Model/AnyId.pm
+++ b/lib/Config/Model/AnyId.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::AnyId;
-$Config::Model::AnyId::VERSION = '2.116';
+$Config::Model::AnyId::VERSION = '2.117';
 use 5.010;
 
 use Mouse;
@@ -943,7 +943,6 @@ sub auto_vivify {
     my $imode = $self->instance->get_data_mode;
     $self->set_data_mode( $idx, $imode );
 
-    $self->notify_change(note => "added entry $idx");
     $self->_store( $idx, $item );
 }
 
@@ -1038,7 +1037,7 @@ Config::Model::AnyId - Base class for hash or list element
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -1643,7 +1642,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/AnyThing.pm b/lib/Config/Model/AnyThing.pm
index a4a381a..ace8a06 100644
--- a/lib/Config/Model/AnyThing.pm
+++ b/lib/Config/Model/AnyThing.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::AnyThing;
-$Config::Model::AnyThing::VERSION = '2.116';
+$Config::Model::AnyThing::VERSION = '2.117';
 use Mouse;
 
 # FIXME: must cleanup warp mechanism to implement this
@@ -327,7 +327,7 @@ Config::Model::AnyThing - Base class for configuration tree item
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -518,7 +518,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Backend/Any.pm b/lib/Config/Model/Backend/Any.pm
index 6b008ea..287b91c 100644
--- a/lib/Config/Model/Backend/Any.pm
+++ b/lib/Config/Model/Backend/Any.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Backend::Any;
-$Config::Model::Backend::Any::VERSION = '2.116';
+$Config::Model::Backend::Any::VERSION = '2.117';
 use Carp;
 use strict;
 use warnings;
@@ -183,7 +183,7 @@ Config::Model::Backend::Any - Virtual class for other backends
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -520,7 +520,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Backend/CdsFile.pm b/lib/Config/Model/Backend/CdsFile.pm
index cfc953b..a088227 100644
--- a/lib/Config/Model/Backend/CdsFile.pm
+++ b/lib/Config/Model/Backend/CdsFile.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Backend::CdsFile;
-$Config::Model::Backend::CdsFile::VERSION = '2.116';
+$Config::Model::Backend::CdsFile::VERSION = '2.117';
 use 5.10.1;
 use Carp;
 use strict;
@@ -79,7 +79,7 @@ Config::Model::Backend::CdsFile - Read and write config as a Cds data structure
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -203,7 +203,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Backend/Fstab.pm b/lib/Config/Model/Backend/Fstab.pm
index b9f761c..dc395af 100644
--- a/lib/Config/Model/Backend/Fstab.pm
+++ b/lib/Config/Model/Backend/Fstab.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Backend::Fstab;
-$Config::Model::Backend::Fstab::VERSION = '2.116';
+$Config::Model::Backend::Fstab::VERSION = '2.117';
 use Mouse;
 use Carp;
 use Log::Log4perl qw(get_logger :levels);
@@ -162,7 +162,7 @@ Config::Model::Backend::Fstab - Read and write config from fstab file
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -225,7 +225,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Backend/IniFile.pm b/lib/Config/Model/Backend/IniFile.pm
index 9a38dd9..7e9fee7 100644
--- a/lib/Config/Model/Backend/IniFile.pm
+++ b/lib/Config/Model/Backend/IniFile.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Backend::IniFile;
-$Config::Model::Backend::IniFile::VERSION = '2.116';
+$Config::Model::Backend::IniFile::VERSION = '2.117';
 use Carp;
 use Mouse;
 use 5.10.0;
@@ -412,7 +412,7 @@ Config::Model::Backend::IniFile - Read and write config as a INI file
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -740,7 +740,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Backend/Json.pm b/lib/Config/Model/Backend/Json.pm
index e8f5385..f3b4668 100644
--- a/lib/Config/Model/Backend/Json.pm
+++ b/lib/Config/Model/Backend/Json.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Backend::Json;
-$Config::Model::Backend::Json::VERSION = '2.116';
+$Config::Model::Backend::Json::VERSION = '2.117';
 use Carp;
 use strict;
 use warnings;
@@ -91,7 +91,7 @@ Config::Model::Backend::Json - Read and write config as a JSON data structure
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -196,7 +196,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Backend/PerlFile.pm b/lib/Config/Model/Backend/PerlFile.pm
index 9bc5aa5..5ce0288 100644
--- a/lib/Config/Model/Backend/PerlFile.pm
+++ b/lib/Config/Model/Backend/PerlFile.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Backend::PerlFile;
-$Config::Model::Backend::PerlFile::VERSION = '2.116';
+$Config::Model::Backend::PerlFile::VERSION = '2.117';
 use 5.10.1;
 use Carp;
 use strict;
@@ -88,7 +88,7 @@ Config::Model::Backend::PerlFile - Read and write config as a Perl data structur
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -212,7 +212,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Backend/PlainFile.pm b/lib/Config/Model/Backend/PlainFile.pm
index 2c089bc..4a14dbf 100644
--- a/lib/Config/Model/Backend/PlainFile.pm
+++ b/lib/Config/Model/Backend/PlainFile.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Backend::PlainFile;
-$Config::Model::Backend::PlainFile::VERSION = '2.116';
+$Config::Model::Backend::PlainFile::VERSION = '2.117';
 use 5.10.1;
 use Carp;
 use Mouse;
@@ -19,6 +19,7 @@ use Log::Log4perl qw(get_logger :levels);
 extends 'Config::Model::Backend::Any';
 
 with "Config::Model::Role::ComputeFunction";
+with "Config::Model::Role::FileHandler";
 
 my $logger = get_logger("Backend::PlainFile");
 
@@ -46,7 +47,6 @@ sub read {
     # check      => yes|no|skip
 
     my $check = $args{check} || 'yes';
-    my $dir   = $args{config_dir};
     my $node  = $args{object};
     $logger->trace( "called on node ", $node->name );
 
@@ -55,8 +55,8 @@ sub read {
     foreach my $elt ( $node->get_element_names(all => 1) ) {
         my $obj = $args{object}->fetch_element( name => $elt );
 
-        my $dir = path($args{root} . $dir);
         my $file_name = $args{file} ? $obj->compute_string($args{file}) : $elt;
+        my $dir = $self->get_tuned_config_dir(%args);
         my $file = $dir->child($file_name);
 
         $logger->trace("looking for plainfile $file ");
@@ -125,8 +125,10 @@ sub write {
     # check      => yes|no|skip
 
     my $check = $args{check} || 'yes';
-    my $dir = path($args{root} . $args{config_dir});
-    $dir->mkpath({ mode => 0755 } ) unless -d $dir;
+    my $cfg_dir = $args{config_dir};
+    my $dir = $self->get_tuned_config_dir(%args);
+    $dir->mkpath({ mode => 0755 } ) unless $dir->is_dir;
+
     my $node = $args{object};
     $logger->debug( "PlainFile write called on node ", $node->name );
 
@@ -180,18 +182,17 @@ sub delete {
     # io_handle  => $io           # IO::File object
     # check      => yes|no|skip
 
-    my $dir = $args{root} . $args{config_dir};
+    my $dir = $self->get_tuned_config_dir(%args);
     my $node = $args{object};
     $logger->debug( "PlainFile delete called on deleted node");
 
     # write data from leaf element from the node
     foreach my $elt ( $node->get_element_name() ) {
-        my $obj = $args{object}->fetch_element( name => $elt );
+        my $obj = $node->fetch_element( name => $elt );
 
-        my $file = $dir;
-        $file .= $args{file} ? $obj->compute_string($args{file}) : $elt;
+        my $file = $dir->child($args{file} ? $obj->compute_string($args{file}) : $elt);
         $logger->info( "Removing $file (deleted node)" );
-        unlink($file);
+        $file->remove;
     }
 }
 
@@ -214,7 +215,7 @@ Config::Model::Backend::PlainFile - Read and write config as plain file
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -338,7 +339,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Backend/ShellVar.pm b/lib/Config/Model/Backend/ShellVar.pm
index e38c0ca..6888205 100644
--- a/lib/Config/Model/Backend/ShellVar.pm
+++ b/lib/Config/Model/Backend/ShellVar.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Backend::ShellVar;
-$Config::Model::Backend::ShellVar::VERSION = '2.116';
+$Config::Model::Backend::ShellVar::VERSION = '2.117';
 use Carp;
 use Mouse;
 use Config::Model::Exception;
@@ -134,7 +134,7 @@ Config::Model::Backend::ShellVar - Read and write config as a C<SHELLVAR> data s
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -224,7 +224,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Backend/Yaml.pm b/lib/Config/Model/Backend/Yaml.pm
index bfb3de1..aa2dbb4 100644
--- a/lib/Config/Model/Backend/Yaml.pm
+++ b/lib/Config/Model/Backend/Yaml.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Backend::Yaml;
-$Config::Model::Backend::Yaml::VERSION = '2.116';
+$Config::Model::Backend::Yaml::VERSION = '2.117';
 use 5.10.1;
 use Carp;
 use strict;
@@ -127,7 +127,7 @@ Config::Model::Backend::Yaml - Read and write config as a YAML data structure
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -294,7 +294,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/BackendMgr.pm b/lib/Config/Model/BackendMgr.pm
index fd32e39..72a2b85 100644
--- a/lib/Config/Model/BackendMgr.pm
+++ b/lib/Config/Model/BackendMgr.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::BackendMgr;
-$Config::Model::BackendMgr::VERSION = '2.116';
+$Config::Model::BackendMgr::VERSION = '2.117';
 use Mouse;
 use strict;
 use warnings;
@@ -67,11 +67,6 @@ sub _build_backend_obj {
     return $c->new( node => $self->node, name => $backend );
 }
 
-# Configuration directory where to read and write files. This value
-# does not override the configuration directory specified in the model
-# data passed to read and write functions.
-has config_dir => ( is => 'ro', isa => 'Maybe[Str]', required => 0 );
-
 has support_annotation => (
     is => 'ro',
     isa => 'Bool',
@@ -89,15 +84,14 @@ sub get_cfg_dir_path {
     my $w = $args{write} || 0;
     my $dir = $self->get_tuned_config_dir(%args);
 
-    $dir = $args{root} . $dir;
-
-    if ( not -d $dir and $w and $args{auto_create} ) {
+    if ( not $dir->is_dir and $w and $args{auto_create} ) {
         $logger->info("creating directory $dir");
-        mkpath( $dir, 0, 0755 );
+        $dir->mkpath;
     }
 
-    unless ( -d $dir ) {
-        $logger->info( "auto_" . ( $w ? 'write' : 'read' ) . " $args{backend} no directory $dir" );
+    unless ( $dir->is_dir ) {
+        my $mode = $w ? 'write' : 'read';
+        $logger->info( "$args{backend}: missing directory $dir ($mode mode)" );
         return ( 0, $dir );
     }
 
@@ -123,11 +117,10 @@ sub get_cfg_file_path {
     }
 
     if ( defined $cfo ) {
-        my $override = $args{root} . $args{config_file};
-        $logger->trace( "auto_"
-                . ( $w ? 'write' : 'read' )
-                . " $args{backend} override target file is $override" );
-        return ( 1, $args{root} . $args{config_file} );
+        my $override =  $args{root} ? path($args{root})->child($cfo) : path($cfo);
+        my $mode = $w ? 'write' : 'read';
+        $logger->trace("$args{backend} override target file is $override ($mode mode)");
+        return ( 1, $override );
     }
 
     Config::Model::Exception::Model->throw(
@@ -139,7 +132,7 @@ sub get_cfg_file_path {
 
     if ( defined $args{file} ) {
         my $file = $args{skip_compute} ? $args{file} : $self->node->compute_string($args{file});
-        my $res = $dir . $file;
+        my $res = $dir->child($file);
         $logger->trace("get_cfg_file_path: returns $res");
         return ( $dir_ok, $res );
     }
@@ -355,12 +348,7 @@ sub try_read_backend {
     };
     $error = $@;
 
-    # only backend based on C::M::Backend::Any can support annotations
-    if ($backend_obj->can('annotation')) {
-        $self->{support_annotation} ||= $backend_obj->annotation ;
-    }
-
-    # catch eval errors done in the if-then-else block before
+    # catch eval error
     if ( ref($error) and $error->isa('Config::Model::Exception::Syntax') ) {
 
         $error->parsed_file( $file_path) unless $error->parsed_file;
@@ -376,6 +364,11 @@ sub try_read_backend {
         die "Backend error: $error";
     }
 
+    # only backend based on C::M::Backend::Any can support annotations
+    if ($backend_obj->can('annotation')) {
+        $self->{support_annotation} = $backend_obj->annotation ;
+    }
+
     return ( $res, $file_path );
 }
 
@@ -560,7 +553,7 @@ Config::Model::BackendMgr - Load configuration node on demand
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -818,7 +811,7 @@ C<rw_config> specification.
 
 =head2 support_annotation
 
-Returns 1 if at least one of the backends support to read and write annotations
+Returns 1 if at least the backend supports read and write annotations
 (aka comments) in the configuration file.
 
 =head1 AUTHOR
@@ -836,7 +829,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/BackendTrackOrder.pm b/lib/Config/Model/BackendTrackOrder.pm
index 216810f..4d5987e 100644
--- a/lib/Config/Model/BackendTrackOrder.pm
+++ b/lib/Config/Model/BackendTrackOrder.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::BackendTrackOrder;
-$Config::Model::BackendTrackOrder::VERSION = '2.116';
+$Config::Model::BackendTrackOrder::VERSION = '2.117';
 # ABSTRACT: Track read order of elements from configuration
 
 use Mouse;
@@ -140,7 +140,7 @@ Config::Model::BackendTrackOrder - Track read order of elements from configurati
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -217,7 +217,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/CheckList.pm b/lib/Config/Model/CheckList.pm
index 7986ab2..bdcef33 100644
--- a/lib/Config/Model/CheckList.pm
+++ b/lib/Config/Model/CheckList.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::CheckList;
-$Config::Model::CheckList::VERSION = '2.116';
+$Config::Model::CheckList::VERSION = '2.117';
 use Mouse;
 use 5.010;
 
@@ -755,7 +755,7 @@ Config::Model::CheckList - Handle check list element
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -1207,7 +1207,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Cookbook/CreateModelFromDoc.pod b/lib/Config/Model/Cookbook/CreateModelFromDoc.pod
index 16264ad..85d9c5a 100644
--- a/lib/Config/Model/Cookbook/CreateModelFromDoc.pod
+++ b/lib/Config/Model/Cookbook/CreateModelFromDoc.pod
@@ -13,7 +13,7 @@ Config::Model::Cookbook::CreateModelFromDoc - Create a configuration model from
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 Introduction
 
@@ -306,7 +306,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Describe.pm b/lib/Config/Model/Describe.pm
index 1024f9a..1e9d7ac 100644
--- a/lib/Config/Model/Describe.pm
+++ b/lib/Config/Model/Describe.pm
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
@@ -9,7 +9,7 @@
 #
 
 package Config::Model::Describe;
-$Config::Model::Describe::VERSION = '2.116';
+$Config::Model::Describe::VERSION = '2.117';
 use Carp;
 use strict;
 use warnings;
@@ -214,7 +214,7 @@ Config::Model::Describe - Provide a description of a node element
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -341,7 +341,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/DumpAsData.pm b/lib/Config/Model/DumpAsData.pm
index c2a818d..4660c44 100644
--- a/lib/Config/Model/DumpAsData.pm
+++ b/lib/Config/Model/DumpAsData.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::DumpAsData;
-$Config::Model::DumpAsData::VERSION = '2.116';
+$Config::Model::DumpAsData::VERSION = '2.117';
 use Carp;
 use strict;
 use warnings;
@@ -256,7 +256,7 @@ Config::Model::DumpAsData - Dump configuration content as a perl data structure
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -421,7 +421,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Dumper.pm b/lib/Config/Model/Dumper.pm
index b38b8ca..09b3f26 100644
--- a/lib/Config/Model/Dumper.pm
+++ b/lib/Config/Model/Dumper.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Dumper;
-$Config::Model::Dumper::VERSION = '2.116';
+$Config::Model::Dumper::VERSION = '2.117';
 use Carp;
 use strict;
 use warnings;
@@ -259,7 +259,7 @@ Config::Model::Dumper - Serialize data of config tree
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -394,7 +394,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Exception.pm b/lib/Config/Model/Exception.pm
index cd3591e..ab58955 100644
--- a/lib/Config/Model/Exception.pm
+++ b/lib/Config/Model/Exception.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Exception;
-$Config::Model::Exception::VERSION = '2.116';
+$Config::Model::Exception::VERSION = '2.117';
 use warnings;
 use strict;
 use Data::Dumper;
@@ -100,19 +100,19 @@ sub full_message {
 }
 
 package Config::Model::Exception::Any;
-$Config::Model::Exception::Any::VERSION = '2.116';
+$Config::Model::Exception::Any::VERSION = '2.117';
 use Mouse;
 extends 'Config::Model::Exception';
 
 package Config::Model::Exception::ModelDeclaration;
-$Config::Model::Exception::ModelDeclaration::VERSION = '2.116';
+$Config::Model::Exception::ModelDeclaration::VERSION = '2.117';
 use Mouse;
 extends 'Config::Model::Exception::Fatal';
 
 sub _desc {'configuration model declaration error' }
 
 package Config::Model::Exception::User ;
-$Config::Model::Exception::User::VERSION = '2.116';
+$Config::Model::Exception::User::VERSION = '2.117';
 use Mouse;
 extends 'Config::Model::Exception::Any';
 sub _desc {'user error' }
@@ -120,7 +120,7 @@ sub _desc {'user error' }
 
 ## old classes below
 package Config::Model::Exception::Syntax;
-$Config::Model::Exception::Syntax::VERSION = '2.116';
+$Config::Model::Exception::Syntax::VERSION = '2.117';
 use Mouse;
 extends 'Config::Model::Exception::Any';
 
@@ -141,7 +141,7 @@ sub full_message {
 }
 
 package Config::Model::Exception::LoadData;
-$Config::Model::Exception::LoadData::VERSION = '2.116';
+$Config::Model::Exception::LoadData::VERSION = '2.117';
 use Mouse;
 extends 'Config::Model::Exception::User';
 
@@ -165,7 +165,7 @@ sub full_message {
 }
 
 package Config::Model::Exception::Model;
-$Config::Model::Exception::Model::VERSION = '2.116';
+$Config::Model::Exception::Model::VERSION = '2.117';
 use Mouse;
 extends 'Config::Model::Exception::Fatal';
 
@@ -198,7 +198,7 @@ sub full_message {
 }
 
 package Config::Model::Exception::Load;
-$Config::Model::Exception::Load::VERSION = '2.116';
+$Config::Model::Exception::Load::VERSION = '2.117';
 use Mouse;
 extends 'Config::Model::Exception::User';
 
@@ -227,7 +227,7 @@ sub full_message {
 }
 
 package Config::Model::Exception::UnavailableElement;
-$Config::Model::Exception::UnavailableElement::VERSION = '2.116';
+$Config::Model::Exception::UnavailableElement::VERSION = '2.117';
 use Mouse;
 extends 'Config::Model::Exception::User';
 
@@ -258,7 +258,7 @@ sub full_message {
 }
 
 package Config::Model::Exception::AncestorClass;
-$Config::Model::Exception::AncestorClass::VERSION = '2.116';
+$Config::Model::Exception::AncestorClass::VERSION = '2.117';
 use Mouse;
 extends 'Config::Model::Exception::User';
 
@@ -266,7 +266,7 @@ sub _desc { 'unknown ancestor class'}
 
 
 package Config::Model::Exception::ObsoleteElement;
-$Config::Model::Exception::ObsoleteElement::VERSION = '2.116';
+$Config::Model::Exception::ObsoleteElement::VERSION = '2.117';
 use Mouse;
 extends 'Config::Model::Exception::User';
 
@@ -291,7 +291,7 @@ sub full_message {
 }
 
 package Config::Model::Exception::UnknownElement;
-$Config::Model::Exception::UnknownElement::VERSION = '2.116';
+$Config::Model::Exception::UnknownElement::VERSION = '2.117';
 use Carp;
 
 use Mouse;
@@ -368,14 +368,14 @@ sub full_message {
 }
 
 package Config::Model::Exception::WarpError;
-$Config::Model::Exception::WarpError::VERSION = '2.116';
+$Config::Model::Exception::WarpError::VERSION = '2.117';
 use Mouse;
 extends 'Config::Model::Exception::User';
 
 sub _desc { 'warp error'}
 
 package Config::Model::Exception::Fatal;
-$Config::Model::Exception::Fatal::VERSION = '2.116';
+$Config::Model::Exception::Fatal::VERSION = '2.117';
 use Mouse;
 extends 'Config::Model::Exception::Any';
 
@@ -383,7 +383,7 @@ sub _desc { 'fatal error' }
 
 
 package Config::Model::Exception::UnknownId;
-$Config::Model::Exception::UnknownId::VERSION = '2.116';
+$Config::Model::Exception::UnknownId::VERSION = '2.117';
 use Mouse;
 extends 'Config::Model::Exception::User';
 
@@ -417,7 +417,7 @@ sub full_message {
 }
 
 package Config::Model::Exception::WrongValue;
-$Config::Model::Exception::WrongValue::VERSION = '2.116';
+$Config::Model::Exception::WrongValue::VERSION = '2.117';
 use Mouse;
 extends 'Config::Model::Exception::User';
 
@@ -425,7 +425,7 @@ sub _desc { 'wrong value'};
 
 
 package Config::Model::Exception::WrongType;
-$Config::Model::Exception::WrongType::VERSION = '2.116';
+$Config::Model::Exception::WrongType::VERSION = '2.117';
 use Mouse;
 extends 'Config::Model::Exception::User';
 
@@ -459,20 +459,24 @@ sub full_message {
 }
 
 package Config::Model::Exception::ConfigFile;
-$Config::Model::Exception::ConfigFile::VERSION = '2.116';
+$Config::Model::Exception::ConfigFile::VERSION = '2.117';
 use Mouse;
 extends 'Config::Model::Exception::User';
 
 sub _desc { 'error in configuration file' }
 
 package Config::Model::Exception::ConfigFile::Missing;
-$Config::Model::Exception::ConfigFile::Missing::VERSION = '2.116';
+$Config::Model::Exception::ConfigFile::Missing::VERSION = '2.117';
 use Mouse;
+use Mouse::Util::TypeConstraints;
+
 extends 'Config::Model::Exception::ConfigFile';
 
 sub _desc { 'missing configuration file'}
 
-has file => (is => 'rw', isa => 'Str');
+subtype 'ExcpPathTiny', as 'Object', where {$_->isa('Path::Tiny')} ;
+
+has file => (is => 'rw', isa => 'Str | ExcpPathTiny' );
 
 sub full_message {
     my $self = shift;
@@ -481,14 +485,14 @@ sub full_message {
 }
 
 package Config::Model::Exception::Formula;
-$Config::Model::Exception::Formula::VERSION = '2.116';
+$Config::Model::Exception::Formula::VERSION = '2.117';
 use Mouse;
 extends 'Config::Model::Exception::Model';
 
 sub _desc { 'error in computation formula of the configuration model'}
 
 package Config::Model::Exception::Internal;
-$Config::Model::Exception::Internal::VERSION = '2.116';
+$Config::Model::Exception::Internal::VERSION = '2.117';
 use Mouse;
 extends 'Config::Model::Exception::Fatal';
 
@@ -510,7 +514,7 @@ Config::Model::Exception - Exception mechanism for configuration model
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -568,7 +572,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/FuseUI.pm b/lib/Config/Model/FuseUI.pm
index ddedb09..92dac3e 100644
--- a/lib/Config/Model/FuseUI.pm
+++ b/lib/Config/Model/FuseUI.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::FuseUI;
-$Config::Model::FuseUI::VERSION = '2.116';
+$Config::Model::FuseUI::VERSION = '2.117';
 # there's no Singleton with Mouse
 use Mouse;
 
@@ -327,7 +327,7 @@ Config::Model::FuseUI - Fuse virtual file interface for Config::Model
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -428,7 +428,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/HashId.pm b/lib/Config/Model/HashId.pm
index 5eb055f..e428db1 100644
--- a/lib/Config/Model/HashId.pm
+++ b/lib/Config/Model/HashId.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::HashId;
-$Config::Model::HashId::VERSION = '2.116';
+$Config::Model::HashId::VERSION = '2.117';
 use Mouse;
 use 5.10.1;
 
@@ -158,6 +158,7 @@ sub _store {
     my ( $self, $key, $value ) = @_;
     push @{ $self->{list} }, $key
         unless exists $self->{data}{$key};
+    $self->notify_change(note => "added entry $key") if $self->write_empty_value;
     return $self->{data}{$key} = $value;
 }
 
@@ -538,7 +539,7 @@ Config::Model::HashId - Handle hash element for configuration model
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -656,7 +657,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/IdElementReference.pm b/lib/Config/Model/IdElementReference.pm
index ea2d6fa..b0dfc8a 100644
--- a/lib/Config/Model/IdElementReference.pm
+++ b/lib/Config/Model/IdElementReference.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::IdElementReference;
-$Config::Model::IdElementReference::VERSION = '2.116';
+$Config::Model::IdElementReference::VERSION = '2.117';
 use Mouse;
 
 use Carp;
@@ -190,7 +190,7 @@ Config::Model::IdElementReference - Refer to id element(s) and extract keys
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -378,7 +378,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Instance.pm b/lib/Config/Model/Instance.pm
index f8e1dfd..615205c 100644
--- a/lib/Config/Model/Instance.pm
+++ b/lib/Config/Model/Instance.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Instance;
-$Config::Model::Instance::VERSION = '2.116';
+$Config::Model::Instance::VERSION = '2.117';
 #use Scalar::Util qw(weaken) ;
 use strict;
 
@@ -661,7 +661,7 @@ Config::Model::Instance - Instance of configuration tree
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -1065,7 +1065,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Iterator.pm b/lib/Config/Model/Iterator.pm
index 5ee0d36..5e681a0 100644
--- a/lib/Config/Model/Iterator.pm
+++ b/lib/Config/Model/Iterator.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Iterator;
-$Config::Model::Iterator::VERSION = '2.116';
+$Config::Model::Iterator::VERSION = '2.117';
 use Carp;
 use strict;
 use warnings;
@@ -281,7 +281,7 @@ Config::Model::Iterator - Iterates forward or backward a configuration tree
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -464,7 +464,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/ListId.pm b/lib/Config/Model/ListId.pm
index 72ed2f9..56458d3 100644
--- a/lib/Config/Model/ListId.pm
+++ b/lib/Config/Model/ListId.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::ListId;
-$Config::Model::ListId::VERSION = '2.116';
+$Config::Model::ListId::VERSION = '2.117';
 use 5.10.1;
 use Mouse;
 
@@ -509,7 +509,7 @@ Config::Model::ListId - Handle list element for configuration model
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -677,7 +677,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Lister.pm b/lib/Config/Model/Lister.pm
index a7a2fa3..0862a91 100644
--- a/lib/Config/Model/Lister.pm
+++ b/lib/Config/Model/Lister.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Lister;
-$Config::Model::Lister::VERSION = '2.116';
+$Config::Model::Lister::VERSION = '2.117';
 use strict;
 use warnings;
 use Exporter;
@@ -92,7 +92,7 @@ Config::Model::Lister - List available models and applications
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -151,7 +151,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Loader.pm b/lib/Config/Model/Loader.pm
index be6ecab..13ea258 100644
--- a/lib/Config/Model/Loader.pm
+++ b/lib/Config/Model/Loader.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Loader;
-$Config::Model::Loader::VERSION = '2.116';
+$Config::Model::Loader::VERSION = '2.117';
 use Carp;
 use strict;
 use warnings;
@@ -898,7 +898,7 @@ Config::Model::Loader - Load serialized data into config tree
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -1312,7 +1312,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Manual/ModelCreationAdvanced.pod b/lib/Config/Model/Manual/ModelCreationAdvanced.pod
index c430100..bf08891 100644
--- a/lib/Config/Model/Manual/ModelCreationAdvanced.pod
+++ b/lib/Config/Model/Manual/ModelCreationAdvanced.pod
@@ -13,7 +13,7 @@ Config::Model::Manual::ModelCreationAdvanced - Creating a model with advanced fe
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 Introduction
 
@@ -293,7 +293,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Manual/ModelCreationIntroduction.pod b/lib/Config/Model/Manual/ModelCreationIntroduction.pod
index 7dff033..e3fef96 100644
--- a/lib/Config/Model/Manual/ModelCreationIntroduction.pod
+++ b/lib/Config/Model/Manual/ModelCreationIntroduction.pod
@@ -13,7 +13,7 @@ Config::Model::Manual::ModelCreationIntroduction - Introduction to model creatio
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 Introduction
 
@@ -832,7 +832,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Node.pm b/lib/Config/Model/Node.pm
index 6cb73a0..160afa7 100644
--- a/lib/Config/Model/Node.pm
+++ b/lib/Config/Model/Node.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Node;
-$Config::Model::Node::VERSION = '2.116';
+$Config::Model::Node::VERSION = '2.117';
 use Mouse;
 with "Config::Model::Role::NodeLoader";
 
@@ -1208,7 +1208,7 @@ Config::Model::Node - Class for configuration tree node
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -1937,7 +1937,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/ObjTreeScanner.pm b/lib/Config/Model/ObjTreeScanner.pm
index c3e05fb..ca6adf1 100644
--- a/lib/Config/Model/ObjTreeScanner.pm
+++ b/lib/Config/Model/ObjTreeScanner.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::ObjTreeScanner;
-$Config::Model::ObjTreeScanner::VERSION = '2.116';
+$Config::Model::ObjTreeScanner::VERSION = '2.117';
 use strict;
 use Config::Model::Exception;
 use Scalar::Util qw/blessed/;
@@ -285,7 +285,7 @@ Config::Model::ObjTreeScanner - Scan config tree and perform call-backs for each
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -699,7 +699,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Report.pm b/lib/Config/Model/Report.pm
index 8f50d5e..bae7a0c 100644
--- a/lib/Config/Model/Report.pm
+++ b/lib/Config/Model/Report.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Report;
-$Config::Model::Report::VERSION = '2.116';
+$Config::Model::Report::VERSION = '2.117';
 use Carp;
 use strict;
 use warnings;
@@ -90,7 +90,7 @@ Config::Model::Report - Reports data from config tree
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -221,7 +221,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Role/ComputeFunction.pm b/lib/Config/Model/Role/ComputeFunction.pm
index 9ce783b..92061af 100644
--- a/lib/Config/Model/Role/ComputeFunction.pm
+++ b/lib/Config/Model/Role/ComputeFunction.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Role::ComputeFunction;
-$Config::Model::Role::ComputeFunction::VERSION = '2.116';
+$Config::Model::Role::ComputeFunction::VERSION = '2.117';
 # ABSTRACT: compute &index or &element functions
 
 use Mouse::Role;
@@ -88,7 +88,7 @@ Config::Model::Role::ComputeFunction - compute &index or &element functions
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -145,7 +145,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Role/FileHandler.pm b/lib/Config/Model/Role/FileHandler.pm
index 1afc826..90a325e 100644
--- a/lib/Config/Model/Role/FileHandler.pm
+++ b/lib/Config/Model/Role/FileHandler.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Role::FileHandler;
-$Config::Model::Role::FileHandler::VERSION = '2.116';
+$Config::Model::Role::FileHandler::VERSION = '2.117';
 # ABSTRACT: role to read or write configuration files
 
 use strict;
@@ -18,9 +18,9 @@ use 5.10.0;
 
 use Mouse::Util;
 use Log::Log4perl qw(get_logger :levels);
+use Path::Tiny;
 
 use Mouse::Role;
-requires 'config_dir';
 
 my $logger = get_logger("FileHandler");
 
@@ -28,6 +28,11 @@ my $logger = get_logger("FileHandler");
 my $__test_home = '';
 sub _set_test_home { $__test_home = shift; }
 
+# Configuration directory where to read and write files. This value
+# does not override the configuration directory specified in the model
+# data passed to read and write functions.
+has config_dir => ( is => 'ro', isa => 'Maybe[Str]', required => 0 );
+
 sub get_tuned_config_dir {
     my ($self, %args) = @_;
 
@@ -38,9 +43,9 @@ sub get_tuned_config_dir {
         $dir =~ s/^~/$home/;
     }
 
-    $dir .= '/' if $dir and $dir !~ m(/$);
-
-    return $dir;
+    return $args{root} ? path($args{root})->child($dir)
+        : $dir ?  path($dir)
+        :         path ('.');
 }
 
 1;
@@ -57,7 +62,7 @@ Config::Model::Role::FileHandler - role to read or write configuration files
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -73,7 +78,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Role/Grab.pm b/lib/Config/Model/Role/Grab.pm
index 5ad50df..b0b1fba 100644
--- a/lib/Config/Model/Role/Grab.pm
+++ b/lib/Config/Model/Role/Grab.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Role::Grab;
-$Config::Model::Role::Grab::VERSION = '2.116';
+$Config::Model::Role::Grab::VERSION = '2.117';
 # ABSTRACT: Role to grab data from elsewhere in the tree
 
 use Mouse::Role;
@@ -366,7 +366,7 @@ Config::Model::Role::Grab - Role to grab data from elsewhere in the tree
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -500,7 +500,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Role/HelpAsText.pm b/lib/Config/Model/Role/HelpAsText.pm
index 5617931..280afe3 100644
--- a/lib/Config/Model/Role/HelpAsText.pm
+++ b/lib/Config/Model/Role/HelpAsText.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Role::HelpAsText;
-$Config::Model::Role::HelpAsText::VERSION = '2.116';
+$Config::Model::Role::HelpAsText::VERSION = '2.117';
 # ABSTRACT: Translate element help from pod to text
 
 use Mouse::Role;
@@ -57,7 +57,7 @@ Config::Model::Role::HelpAsText - Translate element help from pod to text
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -88,7 +88,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Role/NodeLoader.pm b/lib/Config/Model/Role/NodeLoader.pm
index ae6c4a0..b485614 100644
--- a/lib/Config/Model/Role/NodeLoader.pm
+++ b/lib/Config/Model/Role/NodeLoader.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Role::NodeLoader;
-$Config::Model::Role::NodeLoader::VERSION = '2.116';
+$Config::Model::Role::NodeLoader::VERSION = '2.117';
 # ABSTRACT: Load Node element in configuration tree
 
 use Mouse::Role;
@@ -50,7 +50,7 @@ Config::Model::Role::NodeLoader - Load Node element in configuration tree
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -76,7 +76,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Role/WarpMaster.pm b/lib/Config/Model/Role/WarpMaster.pm
index 94dcb00..d64f5af 100644
--- a/lib/Config/Model/Role/WarpMaster.pm
+++ b/lib/Config/Model/Role/WarpMaster.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Role::WarpMaster;
-$Config::Model::Role::WarpMaster::VERSION = '2.116';
+$Config::Model::Role::WarpMaster::VERSION = '2.117';
 # ABSTRACT: register and trigger a warped element
 
 use Mouse::Role;
@@ -106,7 +106,7 @@ Config::Model::Role::WarpMaster - register and trigger a warped element
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -152,7 +152,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/SearchElement.pm b/lib/Config/Model/SearchElement.pm
index 14b46be..feb92eb 100644
--- a/lib/Config/Model/SearchElement.pm
+++ b/lib/Config/Model/SearchElement.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::SearchElement;
-$Config::Model::SearchElement::VERSION = '2.116';
+$Config::Model::SearchElement::VERSION = '2.117';
 use Log::Log4perl qw(get_logger :levels);
 use Carp;
 use strict;
@@ -333,7 +333,7 @@ Config::Model::SearchElement - Search an element in a configuration model
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -579,7 +579,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/SimpleUI.pm b/lib/Config/Model/SimpleUI.pm
index 4493436..cf837b9 100644
--- a/lib/Config/Model/SimpleUI.pm
+++ b/lib/Config/Model/SimpleUI.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::SimpleUI;
-$Config::Model::SimpleUI::VERSION = '2.116';
+$Config::Model::SimpleUI::VERSION = '2.117';
 use Carp;
 use 5.010;
 use strict;
@@ -338,7 +338,7 @@ Config::Model::SimpleUI - Simple interface for Config::Model
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -563,7 +563,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/TermUI.pm b/lib/Config/Model/TermUI.pm
index 89f28d3..b18c0f7 100644
--- a/lib/Config/Model/TermUI.pm
+++ b/lib/Config/Model/TermUI.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::TermUI;
-$Config::Model::TermUI::VERSION = '2.116';
+$Config::Model::TermUI::VERSION = '2.117';
 use Carp;
 use utf8;      # so literals and identifiers can be in UTF-8
 use v5.12;     # or later to get "unicode_strings" feature
@@ -238,7 +238,7 @@ Config::Model::TermUI - Interactive command line interface for cme
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -411,7 +411,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/TreeSearcher.pm b/lib/Config/Model/TreeSearcher.pm
index 73ab793..29e9657 100644
--- a/lib/Config/Model/TreeSearcher.pm
+++ b/lib/Config/Model/TreeSearcher.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::TreeSearcher;
-$Config::Model::TreeSearcher::VERSION = '2.116';
+$Config::Model::TreeSearcher::VERSION = '2.117';
 use Mouse;
 use Mouse::Util::TypeConstraints;
 
@@ -147,7 +147,7 @@ Config::Model::TreeSearcher - Search tree for match in value, description...
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -249,7 +249,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Utils/GenClassPod.pm b/lib/Config/Model/Utils/GenClassPod.pm
index facf3e8..4d6c3c1 100644
--- a/lib/Config/Model/Utils/GenClassPod.pm
+++ b/lib/Config/Model/Utils/GenClassPod.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Utils::GenClassPod;
-$Config::Model::Utils::GenClassPod::VERSION = '2.116';
+$Config::Model::Utils::GenClassPod::VERSION = '2.117';
 # ABSTRACT: generate pod documentation from configuration models
 
 use strict;
@@ -57,7 +57,7 @@ Config::Model::Utils::GenClassPod - generate pod documentation from configuratio
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -86,7 +86,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Value.pm b/lib/Config/Model/Value.pm
index 5c47ceb..646d7cc 100644
--- a/lib/Config/Model/Value.pm
+++ b/lib/Config/Model/Value.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Value;
-$Config::Model::Value::VERSION = '2.116';
+$Config::Model::Value::VERSION = '2.117';
 use 5.10.1;
 
 use Mouse;
@@ -1853,7 +1853,7 @@ Config::Model::Value - Strongly typed configuration value
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -2896,7 +2896,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Value/LayeredInclude.pm b/lib/Config/Model/Value/LayeredInclude.pm
index da7dc6f..3ffe938 100644
--- a/lib/Config/Model/Value/LayeredInclude.pm
+++ b/lib/Config/Model/Value/LayeredInclude.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Value::LayeredInclude;
-$Config::Model::Value::LayeredInclude::VERSION = '2.116';
+$Config::Model::Value::LayeredInclude::VERSION = '2.117';
 use 5.010;
 use strict;
 use warnings;
@@ -108,7 +108,7 @@ Config::Model::Value::LayeredInclude - Include a sub layer configuration
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -164,7 +164,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/ValueComputer.pm b/lib/Config/Model/ValueComputer.pm
index 0f3af97..75517c4 100644
--- a/lib/Config/Model/ValueComputer.pm
+++ b/lib/Config/Model/ValueComputer.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::ValueComputer;
-$Config::Model::ValueComputer::VERSION = '2.116';
+$Config::Model::ValueComputer::VERSION = '2.117';
 use Mouse;
 use MouseX::StrictConstructor;
 
@@ -549,7 +549,7 @@ Config::Model::ValueComputer - Provides configuration value computation
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -1014,7 +1014,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/WarpedNode.pm b/lib/Config/Model/WarpedNode.pm
index f684562..5c04ee8 100644
--- a/lib/Config/Model/WarpedNode.pm
+++ b/lib/Config/Model/WarpedNode.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::WarpedNode;
-$Config::Model::WarpedNode::VERSION = '2.116';
+$Config::Model::WarpedNode::VERSION = '2.117';
 use Mouse;
 
 use Carp qw(cluck croak);
@@ -313,7 +313,7 @@ Config::Model::WarpedNode - Node that change config class properties
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -560,7 +560,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Warper.pm b/lib/Config/Model/Warper.pm
index b2e36a4..b439d80 100644
--- a/lib/Config/Model/Warper.pm
+++ b/lib/Config/Model/Warper.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Warper;
-$Config::Model::Warper::VERSION = '2.116';
+$Config::Model::Warper::VERSION = '2.117';
 use Mouse;
 
 use Log::Log4perl qw(get_logger :levels);
@@ -620,7 +620,7 @@ Config::Model::Warper - Warp tree properties
 
 =head1 VERSION
 
-version 2.116
+version 2.117
 
 =head1 SYNOPSIS
 
@@ -874,7 +874,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2005-2017 by Dominique Dumont.
+This software is Copyright (c) 2005-2018 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/models/Fstab.pl b/lib/Config/Model/models/Fstab.pl
index 77bddd1..51347a0 100644
--- a/lib/Config/Model/models/Fstab.pl
+++ b/lib/Config/Model/models/Fstab.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/lib/Config/Model/models/Fstab/CommonOptions.pl b/lib/Config/Model/models/Fstab/CommonOptions.pl
index d201fff..509e94c 100644
--- a/lib/Config/Model/models/Fstab/CommonOptions.pl
+++ b/lib/Config/Model/models/Fstab/CommonOptions.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/lib/Config/Model/models/Fstab/Ext2FsOpt.pl b/lib/Config/Model/models/Fstab/Ext2FsOpt.pl
index 244def9..0d04ec9 100644
--- a/lib/Config/Model/models/Fstab/Ext2FsOpt.pl
+++ b/lib/Config/Model/models/Fstab/Ext2FsOpt.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/lib/Config/Model/models/Fstab/Ext3FsOpt.pl b/lib/Config/Model/models/Fstab/Ext3FsOpt.pl
index 9e547be..33ed9eb 100644
--- a/lib/Config/Model/models/Fstab/Ext3FsOpt.pl
+++ b/lib/Config/Model/models/Fstab/Ext3FsOpt.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/lib/Config/Model/models/Fstab/Ext4FsOpt.pl b/lib/Config/Model/models/Fstab/Ext4FsOpt.pl
index 373832b..fa95e8b 100644
--- a/lib/Config/Model/models/Fstab/Ext4FsOpt.pl
+++ b/lib/Config/Model/models/Fstab/Ext4FsOpt.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/lib/Config/Model/models/Fstab/FsLine.pl b/lib/Config/Model/models/Fstab/FsLine.pl
index 1d943fe..396a4ac 100644
--- a/lib/Config/Model/models/Fstab/FsLine.pl
+++ b/lib/Config/Model/models/Fstab/FsLine.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/lib/Config/Model/models/Fstab/Iso9660_Opt.pl b/lib/Config/Model/models/Fstab/Iso9660_Opt.pl
index 1bf968a..05a54bb 100644
--- a/lib/Config/Model/models/Fstab/Iso9660_Opt.pl
+++ b/lib/Config/Model/models/Fstab/Iso9660_Opt.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/lib/Config/Model/models/Fstab/NoneOptions.pl b/lib/Config/Model/models/Fstab/NoneOptions.pl
index 10e3a16..16e1758 100644
--- a/lib/Config/Model/models/Fstab/NoneOptions.pl
+++ b/lib/Config/Model/models/Fstab/NoneOptions.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/lib/Config/Model/models/Fstab/SwapOptions.pl b/lib/Config/Model/models/Fstab/SwapOptions.pl
index f02b7ce..30c38c1 100644
--- a/lib/Config/Model/models/Fstab/SwapOptions.pl
+++ b/lib/Config/Model/models/Fstab/SwapOptions.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/lib/Config/Model/models/Fstab/UsbFsOptions.pl b/lib/Config/Model/models/Fstab/UsbFsOptions.pl
index ddfb1b6..d77b562 100644
--- a/lib/Config/Model/models/Fstab/UsbFsOptions.pl
+++ b/lib/Config/Model/models/Fstab/UsbFsOptions.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/lib/Config/Model/models/Multistrap.pl b/lib/Config/Model/models/Multistrap.pl
index 8ceb8d9..0f95fb9 100644
--- a/lib/Config/Model/models/Multistrap.pl
+++ b/lib/Config/Model/models/Multistrap.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/lib/Config/Model/models/Multistrap/Section.pl b/lib/Config/Model/models/Multistrap/Section.pl
index 0215d07..0650eaf 100644
--- a/lib/Config/Model/models/Multistrap/Section.pl
+++ b/lib/Config/Model/models/Multistrap/Section.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/lib/Config/Model/models/PopCon.pl b/lib/Config/Model/models/PopCon.pl
index 5c2633a..ede1063 100644
--- a/lib/Config/Model/models/PopCon.pl
+++ b/lib/Config/Model/models/PopCon.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/annotation.t b/t/annotation.t
index d8f0974..3d5e310 100644
--- a/t/annotation.t
+++ b/t/annotation.t
@@ -72,7 +72,7 @@ foreach (@annotate) {
 }
 
 say "pending changes:\n".$inst->list_changes if $trace;
-is( $inst->needs_save, 6, "verify instance needs_save status after storing only annotations" );
+is( $inst->needs_save, 5, "verify instance needs_save status after storing only annotations" );
 $inst->clear_changes;
 
 is( $root->grab("std_id:ab X")->annotation('to delete'), 'to delete', "test clear annotation" );
diff --git a/t/array_id.t b/t/array_id.t
index eb0aec0..c8fdf32 100644
--- a/t/array_id.t
+++ b/t/array_id.t
@@ -139,7 +139,7 @@ is( $inst->needs_save, 0, "verify instance needs_save status after element creat
 is( $b->fetch_with_id(1)->store('foo'), 1, "stored in 1" );
 is( $b->fetch_with_id(0)->store('baz'), 1, "stored in 0" );
 is( $b->fetch_with_id(2)->store('bar'), 1, "stored in 2" );
-is( $inst->needs_save, 6, "verify instance needs_save status after storing into element" );
+is( $inst->needs_save, 3, "verify instance needs_save status after storing into element" );
 print join( "\n", $inst->list_changes("\n") ), "\n" if $trace;
 
 throws_ok { $b->fetch_with_id(124)->store('baz'); } qr/Index 124 > max_index limit 123/,
diff --git a/t/hash_id_of_values.t b/t/hash_id_of_values.t
index 10bd458..1e5b953 100644
--- a/t/hash_id_of_values.t
+++ b/t/hash_id_of_values.t
@@ -43,6 +43,7 @@ $model->create_config_class(
             type => 'hash',
             class => 'Config::Model::HashId',    # default
             index_type => 'integer',
+            write_empty_value => 1,
 
             # hash boundaries
             min         => 1,
@@ -332,7 +333,7 @@ eq_or_diff( [ $oh->fetch_all_indexes ],
 is( $oh->fetch_with_id('x')->fetch, '2x', "Check copied value" );
 
 $oh->copy(qw/x d/);
-is( $inst->needs_save, 2, "verify instance needs_save status after copy" );
+is( $inst->needs_save, 1, "verify instance needs_save status after copy" );
 print scalar $inst->list_changes, "\n" if $trace;
 $inst->clear_changes;
 
diff --git a/t/lib/Config/Model/models/Master.pl b/t/lib/Config/Model/models/Master.pl
index 9b77c2e..66126b0 100644
--- a/t/lib/Config/Model/models/Master.pl
+++ b/t/lib/Config/Model/models/Master.pl
@@ -2,7 +2,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/lib/DummyNode.pm b/t/lib/DummyNode.pm
index 02eda74..79ab683 100644
--- a/t/lib/DummyNode.pm
+++ b/t/lib/DummyNode.pm
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/lib/MyTestLib.pm b/t/lib/MyTestLib.pm
index ee1ff40..331e7aa 100644
--- a/t/lib/MyTestLib.pm
+++ b/t/lib/MyTestLib.pm
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/lib/dump_load_model.pm b/t/lib/dump_load_model.pm
index 6501995..d3ea619 100644
--- a/t/lib/dump_load_model.pm
+++ b/t/lib/dump_load_model.pm
@@ -2,7 +2,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/lib/test_ini_backend_model.pl b/t/lib/test_ini_backend_model.pl
index 58d6318..80254d8 100644
--- a/t/lib/test_ini_backend_model.pl
+++ b/t/lib/test_ini_backend_model.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/lib/test_yaml_model.pl b/t/lib/test_yaml_model.pl
index fc3a1c0..c0640b3 100644
--- a/t/lib/test_yaml_model.pl
+++ b/t/lib/test_yaml_model.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/model_tests.d/backend-cds-test-conf.pl b/t/model_tests.d/backend-cds-test-conf.pl
index c921dd2..e2cb869 100644
--- a/t/model_tests.d/backend-cds-test-conf.pl
+++ b/t/model_tests.d/backend-cds-test-conf.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/model_tests.d/backend-ini-test-conf.pl b/t/model_tests.d/backend-ini-test-conf.pl
index d37f076..7661f85 100644
--- a/t/model_tests.d/backend-ini-test-conf.pl
+++ b/t/model_tests.d/backend-ini-test-conf.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/model_tests.d/backend-json-test-conf.pl b/t/model_tests.d/backend-json-test-conf.pl
index 09b3777..943ab79 100644
--- a/t/model_tests.d/backend-json-test-conf.pl
+++ b/t/model_tests.d/backend-json-test-conf.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/model_tests.d/backend-key-value-test-conf.pl b/t/model_tests.d/backend-key-value-test-conf.pl
index 7d013c3..f40552a 100644
--- a/t/model_tests.d/backend-key-value-test-conf.pl
+++ b/t/model_tests.d/backend-key-value-test-conf.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/model_tests.d/backend-perl-test-conf.pl b/t/model_tests.d/backend-perl-test-conf.pl
index 33f44b5..6e792e2 100644
--- a/t/model_tests.d/backend-perl-test-conf.pl
+++ b/t/model_tests.d/backend-perl-test-conf.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/model_tests.d/backend-plainfile-test-conf.pl b/t/model_tests.d/backend-plainfile-test-conf.pl
index 1084d89..0d89cec 100644
--- a/t/model_tests.d/backend-plainfile-test-conf.pl
+++ b/t/model_tests.d/backend-plainfile-test-conf.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/model_tests.d/backend-shellvar-test-conf.pl b/t/model_tests.d/backend-shellvar-test-conf.pl
index 64f1384..d64cd3f 100644
--- a/t/model_tests.d/backend-shellvar-test-conf.pl
+++ b/t/model_tests.d/backend-shellvar-test-conf.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/model_tests.d/backend-yaml-data-test-conf.pl b/t/model_tests.d/backend-yaml-data-test-conf.pl
index 107d0ab..d9d432b 100644
--- a/t/model_tests.d/backend-yaml-data-test-conf.pl
+++ b/t/model_tests.d/backend-yaml-data-test-conf.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/model_tests.d/backend-yaml-test-conf.pl b/t/model_tests.d/backend-yaml-test-conf.pl
index ba342dc..d382290 100644
--- a/t/model_tests.d/backend-yaml-test-conf.pl
+++ b/t/model_tests.d/backend-yaml-test-conf.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/model_tests.d/fstab-test-conf.pl b/t/model_tests.d/fstab-test-conf.pl
index d0ad736..8eaaed3 100644
--- a/t/model_tests.d/fstab-test-conf.pl
+++ b/t/model_tests.d/fstab-test-conf.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/model_tests.d/layer-examples/mini/etc/foo-config.pl b/t/model_tests.d/layer-examples/mini/etc/foo-config.pl
index 75912ea..a4a5b2e 100644
--- a/t/model_tests.d/layer-examples/mini/etc/foo-config.pl
+++ b/t/model_tests.d/layer-examples/mini/etc/foo-config.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/model_tests.d/layer-examples/mini/home/joe/foo/config.pl b/t/model_tests.d/layer-examples/mini/home/joe/foo/config.pl
index d8eeceb..7ffed1a 100644
--- a/t/model_tests.d/layer-examples/mini/home/joe/foo/config.pl
+++ b/t/model_tests.d/layer-examples/mini/home/joe/foo/config.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/model_tests.d/layer-test-conf.pl b/t/model_tests.d/layer-test-conf.pl
index 4b31c0b..f1b9091 100644
--- a/t/model_tests.d/layer-test-conf.pl
+++ b/t/model_tests.d/layer-test-conf.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/model_tests.d/multi-ini-test-conf.pl b/t/model_tests.d/multi-ini-test-conf.pl
index 335de98..c68c542 100644
--- a/t/model_tests.d/multi-ini-test-conf.pl
+++ b/t/model_tests.d/multi-ini-test-conf.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/model_tests.d/multistrap-test-conf.pl b/t/model_tests.d/multistrap-test-conf.pl
index e343dff..bf60f37 100644
--- a/t/model_tests.d/multistrap-test-conf.pl
+++ b/t/model_tests.d/multistrap-test-conf.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/model_tests.d/popcon-test-conf.pl b/t/model_tests.d/popcon-test-conf.pl
index d3d65f7..81b8d20 100644
--- a/t/model_tests.d/popcon-test-conf.pl
+++ b/t/model_tests.d/popcon-test-conf.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model
 #
-# This software is Copyright (c) 2005-2017 by Dominique Dumont.
+# This software is Copyright (c) 2005-2018 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/t/value.t b/t/value.t
index e4da168..038c39a 100644
--- a/t/value.t
+++ b/t/value.t
@@ -784,7 +784,7 @@ note "test replace_follow";
     is( $inst->needs_save, 0,     "check needs_save after simple fetch" );
 
     $root->load('replacement_hash:foo=repfoo replacement_hash:bar=repbar');
-    is( $inst->needs_save, 4, "check needs_save after load" );
+    is( $inst->needs_save, 2, "check needs_save after load" );
     $inst->clear_changes;
 
     is( $wrf->fetch,       'repfoo', "check replacement_hash with foo (after replacement)" );
diff --git a/t/value_compute.t b/t/value_compute.t
index 86c6f86..d3127a4 100644
--- a/t/value_compute.t
+++ b/t/value_compute.t
@@ -580,7 +580,7 @@ is( $inst->needs_save, 0, "check needs save before migrate" );
 is( $root->grab_value( step => 'Upstream-Maintainer:0', check => 'no' ),
     'foo', "check migrate_from first stage" );
 is( $root->grab_value( step => 'Upstream-Contact:0' ), 'foo', "check migrate_from second stage" );
-is( $inst->needs_save, 4, "check needs save before migrate" );
+is( $inst->needs_save, 2, "check needs save after migrate" );
 print join( "\n", $inst->list_changes("\n") ), "\n" if $trace;
 
 $root->fetch_element( name => 'Original-Source-Location', check => 'no' )->store('foobar');

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libconfig-model-perl.git



More information about the Pkg-perl-cvs-commits mailing list