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

dod pushed a commit to branch master
in repository libconfig-model-perl.

commit 0f660334aac69d2b383e0caecabe18f878e57a38
Author: Dominique Dumont <d...@debian.org>
Date:   Thu Apr 3 18:58:44 2014 +0200

    Imported Upstream version 2.054
---
 Changes                                            | 11 +++++
 META.json                                          |  2 +-
 META.yml                                           |  2 +-
 lib/Config/Model.pm                                |  4 +-
 lib/Config/Model/Annotation.pm                     |  4 +-
 lib/Config/Model/AnyId.pm                          |  4 +-
 lib/Config/Model/AnyThing.pm                       |  4 +-
 lib/Config/Model/Backend/Any.pm                    |  4 +-
 lib/Config/Model/Backend/Fstab.pm                  |  4 +-
 lib/Config/Model/Backend/IniFile.pm                |  4 +-
 lib/Config/Model/Backend/Json.pm                   |  4 +-
 lib/Config/Model/Backend/PlainFile.pm              |  4 +-
 lib/Config/Model/Backend/ShellVar.pm               |  4 +-
 lib/Config/Model/Backend/Yaml.pm                   |  4 +-
 lib/Config/Model/BackendMgr.pm                     |  4 +-
 lib/Config/Model/CheckList.pm                      |  4 +-
 lib/Config/Model/Cookbook/CreateModelFromDoc.pod   |  2 +-
 lib/Config/Model/Describe.pm                       |  4 +-
 lib/Config/Model/DumpAsData.pm                     |  4 +-
 lib/Config/Model/Dumper.pm                         | 25 +++++++----
 lib/Config/Model/Exception.pm                      | 30 ++++++-------
 lib/Config/Model/FuseUI.pm                         |  4 +-
 lib/Config/Model/HashId.pm                         |  4 +-
 lib/Config/Model/IdElementReference.pm             |  4 +-
 lib/Config/Model/Instance.pm                       |  4 +-
 lib/Config/Model/Iterator.pm                       |  4 +-
 lib/Config/Model/ListId.pm                         | 17 +++++---
 lib/Config/Model/Lister.pm                         |  4 +-
 lib/Config/Model/Loader.pm                         | 29 +++++++++----
 lib/Config/Model/Manual/ModelCreationAdvanced.pod  |  2 +-
 .../Model/Manual/ModelCreationIntroduction.pod     |  2 +-
 lib/Config/Model/Node.pm                           |  4 +-
 lib/Config/Model/ObjTreeScanner.pm                 |  4 +-
 lib/Config/Model/Report.pm                         |  4 +-
 lib/Config/Model/SearchElement.pm                  |  4 +-
 lib/Config/Model/SimpleUI.pm                       |  4 +-
 lib/Config/Model/TermUI.pm                         |  4 +-
 lib/Config/Model/TreeSearcher.pm                   |  4 +-
 lib/Config/Model/Value.pm                          |  4 +-
 lib/Config/Model/Value/LayeredInclude.pm           |  4 +-
 lib/Config/Model/ValueComputer.pm                  |  4 +-
 lib/Config/Model/WarpedNode.pm                     |  4 +-
 lib/Config/Model/Warper.pm                         |  4 +-
 script/cme                                         |  7 +--
 t/array_id.t                                       |  4 ++
 t/dump_load_model.pm                               |  5 ++-
 t/dump_tree.t                                      | 50 ++++++++++++++++------
 t/load.t                                           | 19 ++++----
 48 files changed, 207 insertions(+), 132 deletions(-)

diff --git a/Changes b/Changes
index 3997985..be405a3 100644
--- a/Changes
+++ b/Changes
@@ -1,3 +1,14 @@
+2.054 2014-04-01
+
+  Bug fix release:
+    * Loader Dumper: fix quote handling (Closes Debian 743097)
+    * Loader: return 'ok' after dispatching an action (avoid undef warning
+      during tests)
+    * cme: -save options force a save even if no semantic change was done
+    * ListId: sort may trigger notify_change is elements are actually
+      moved around, so 'cme modify stuff list:.sort' will save the file
+      as expected.
+
 2.053 2014-03-25
 
    Bug fix release:
diff --git a/META.json b/META.json
index a72c534..55f6411 100644
--- a/META.json
+++ b/META.json
@@ -96,6 +96,6 @@
          "web" : "http://github.com/dod38fr/config-model";
       }
    },
-   "version" : "2.053"
+   "version" : "2.054"
 }
 
diff --git a/META.yml b/META.yml
index c2baffb..fb809ed 100644
--- a/META.yml
+++ b/META.yml
@@ -67,4 +67,4 @@ resources:
   bugtracker: http://rt.cpan.org/NoAuth/Bugs.html?Dist=Config-Model
   homepage: https://github.com/dod38fr/config-model/wiki
   repository: git://github.com/dod38fr/config-model.git
-version: '2.053'
+version: '2.054'
diff --git a/lib/Config/Model.pm b/lib/Config/Model.pm
index 695bcb2..4e3fb40 100644
--- a/lib/Config/Model.pm
+++ b/lib/Config/Model.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model;
-$Config::Model::VERSION = '2.053';
+$Config::Model::VERSION = '2.054';
 use Mouse ;
 use namespace::autoclean;
 use Mouse::Util::TypeConstraints;
@@ -1563,7 +1563,7 @@ Config::Model - Create tools to validate, migrate and 
edit configuration files
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Annotation.pm b/lib/Config/Model/Annotation.pm
index 0122586..f82819a 100644
--- a/lib/Config/Model/Annotation.pm
+++ b/lib/Config/Model/Annotation.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Annotation;
-$Config::Model::Annotation::VERSION = '2.053';
+$Config::Model::Annotation::VERSION = '2.054';
 use Mouse ;
 use English ;
 
@@ -186,7 +186,7 @@ Config::Model::Annotation - Read and write configuration 
annotations
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/AnyId.pm b/lib/Config/Model/AnyId.pm
index 39104a2..c5d3d20 100644
--- a/lib/Config/Model/AnyId.pm
+++ b/lib/Config/Model/AnyId.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::AnyId ;
-$Config::Model::AnyId::VERSION = '2.053';
+$Config::Model::AnyId::VERSION = '2.054';
 use Mouse ;
 use namespace::autoclean;
 
@@ -987,7 +987,7 @@ Config::Model::AnyId - Base class for hash or list element
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/AnyThing.pm b/lib/Config/Model/AnyThing.pm
index 157d447..b7193a5 100644
--- a/lib/Config/Model/AnyThing.pm
+++ b/lib/Config/Model/AnyThing.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::AnyThing;
-$Config::Model::AnyThing::VERSION = '2.053';
+$Config::Model::AnyThing::VERSION = '2.054';
 use Mouse ;
 use namespace::autoclean;
 
@@ -584,7 +584,7 @@ Config::Model::AnyThing - Base class for configuration tree 
item
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Backend/Any.pm b/lib/Config/Model/Backend/Any.pm
index 39850dc..8cf5121 100644
--- a/lib/Config/Model/Backend/Any.pm
+++ b/lib/Config/Model/Backend/Any.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Backend::Any ;
-$Config::Model::Backend::Any::VERSION = '2.053';
+$Config::Model::Backend::Any::VERSION = '2.054';
 use Carp;
 use strict;
 use warnings ;
@@ -165,7 +165,7 @@ Config::Model::Backend::Any - Virtual class for other 
backends
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Backend/Fstab.pm 
b/lib/Config/Model/Backend/Fstab.pm
index 9edefc7..b466dda 100644
--- a/lib/Config/Model/Backend/Fstab.pm
+++ b/lib/Config/Model/Backend/Fstab.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Backend::Fstab ;
-$Config::Model::Backend::Fstab::VERSION = '2.053';
+$Config::Model::Backend::Fstab::VERSION = '2.054';
 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.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Backend/IniFile.pm 
b/lib/Config/Model/Backend/IniFile.pm
index 7f74d86..3c413a6 100644
--- a/lib/Config/Model/Backend/IniFile.pm
+++ b/lib/Config/Model/Backend/IniFile.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Backend::IniFile ;
-$Config::Model::Backend::IniFile::VERSION = '2.053';
+$Config::Model::Backend::IniFile::VERSION = '2.054';
 use Carp;
 use Mouse ;
 use 5.10.0;
@@ -312,7 +312,7 @@ Config::Model::Backend::IniFile - Read and write config as 
a INI file
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Backend/Json.pm b/lib/Config/Model/Backend/Json.pm
index ca49121..9d7398c 100644
--- a/lib/Config/Model/Backend/Json.pm
+++ b/lib/Config/Model/Backend/Json.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Backend::Json ;
-$Config::Model::Backend::Json::VERSION = '2.053';
+$Config::Model::Backend::Json::VERSION = '2.054';
 use Carp;
 use strict;
 use warnings ;
@@ -94,7 +94,7 @@ Config::Model::Backend::Json - Read and write config as a 
JSON data structure
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Backend/PlainFile.pm 
b/lib/Config/Model/Backend/PlainFile.pm
index c8b8473..f76e1c6 100644
--- a/lib/Config/Model/Backend/PlainFile.pm
+++ b/lib/Config/Model/Backend/PlainFile.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Backend::PlainFile;
-$Config::Model::Backend::PlainFile::VERSION = '2.053';
+$Config::Model::Backend::PlainFile::VERSION = '2.054';
 use Carp;
 use Mouse;
 use Config::Model::Exception;
@@ -189,7 +189,7 @@ Config::Model::Backend::PlainFile - Read and write config 
as plain file
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Backend/ShellVar.pm 
b/lib/Config/Model/Backend/ShellVar.pm
index 8973c0e..2b8ff54 100644
--- a/lib/Config/Model/Backend/ShellVar.pm
+++ b/lib/Config/Model/Backend/ShellVar.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Backend::ShellVar ;
-$Config::Model::Backend::ShellVar::VERSION = '2.053';
+$Config::Model::Backend::ShellVar::VERSION = '2.054';
 use Carp;
 use Mouse ;
 use Config::Model::Exception ;
@@ -113,7 +113,7 @@ Config::Model::Backend::ShellVar - Read and write config as 
a C<SHELLVAR> data s
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Backend/Yaml.pm b/lib/Config/Model/Backend/Yaml.pm
index 6ba44b6..e0db7c3 100644
--- a/lib/Config/Model/Backend/Yaml.pm
+++ b/lib/Config/Model/Backend/Yaml.pm
@@ -9,7 +9,7 @@
 #
 
 package Config::Model::Backend::Yaml ;
-$Config::Model::Backend::Yaml::VERSION = '2.053';
+$Config::Model::Backend::Yaml::VERSION = '2.054';
 use Carp;
 use strict;
 use warnings ;
@@ -95,7 +95,7 @@ Config::Model::Backend::Yaml - Read and write config as a 
YAML data structure
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/BackendMgr.pm b/lib/Config/Model/BackendMgr.pm
index 51e75db..a90521f 100644
--- a/lib/Config/Model/BackendMgr.pm
+++ b/lib/Config/Model/BackendMgr.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::BackendMgr ;
-$Config::Model::BackendMgr::VERSION = '2.053';
+$Config::Model::BackendMgr::VERSION = '2.054';
 use Mouse ;
 use namespace::autoclean;
 
@@ -747,7 +747,7 @@ Config::Model::BackendMgr - Load configuration node on 
demand
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/CheckList.pm b/lib/Config/Model/CheckList.pm
index 92b6fb3..e488e39 100644
--- a/lib/Config/Model/CheckList.pm
+++ b/lib/Config/Model/CheckList.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::CheckList ;
-$Config::Model::CheckList::VERSION = '2.053';
+$Config::Model::CheckList::VERSION = '2.054';
 use Mouse ;
 use 5.010 ;
 
@@ -727,7 +727,7 @@ Config::Model::CheckList - Handle check list element
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Cookbook/CreateModelFromDoc.pod 
b/lib/Config/Model/Cookbook/CreateModelFromDoc.pod
index 244e8f1..db2cdba 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.053
+version 2.054
 
 =head1 Introduction
 
diff --git a/lib/Config/Model/Describe.pm b/lib/Config/Model/Describe.pm
index d02e85f..dd04d30 100644
--- a/lib/Config/Model/Describe.pm
+++ b/lib/Config/Model/Describe.pm
@@ -9,7 +9,7 @@
 #
 
 package Config::Model::Describe;
-$Config::Model::Describe::VERSION = '2.053';
+$Config::Model::Describe::VERSION = '2.054';
 use Carp;
 use strict;
 use warnings ;
@@ -170,7 +170,7 @@ Config::Model::Describe - Provide a description of a node 
element
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/DumpAsData.pm b/lib/Config/Model/DumpAsData.pm
index 92740c0..05e13da 100644
--- a/lib/Config/Model/DumpAsData.pm
+++ b/lib/Config/Model/DumpAsData.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::DumpAsData;
-$Config::Model::DumpAsData::VERSION = '2.053';
+$Config::Model::DumpAsData::VERSION = '2.054';
 use Carp;
 use strict;
 use warnings ;
@@ -251,7 +251,7 @@ Config::Model::DumpAsData - Dump configuration content as a 
perl data structure
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Dumper.pm b/lib/Config/Model/Dumper.pm
index 21f7aa4..73bc75f 100644
--- a/lib/Config/Model/Dumper.pm
+++ b/lib/Config/Model/Dumper.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Dumper;
-$Config::Model::Dumper::VERSION = '2.053';
+$Config::Model::Dumper::VERSION = '2.054';
 use Carp;
 use strict;
 use warnings ;
@@ -22,9 +22,18 @@ sub new {
 }
 
 sub quote {
-    my @res = @_ ;
+    _quote(qr/(\s|"|\*)/,@_) ;
+}
+
+sub id_quote {
+    _quote(qr/[\s"\*<>.=#]/,@_) ;
+}
+
+
+sub _quote {
+    my ($re,@res) = @_ ;
     foreach (@res) {
-       if ( defined $_ and ( /(\s|"|\*)/ or $_ eq '') ) {
+       if ( defined $_ and ( /$re/ or $_ eq '') ) {
            s/"/\\"/g ; # escape present quotes
            $_ = '"' . $_ . '"' ; # add my quotes
        }
@@ -86,7 +95,7 @@ sub dump_tree {
 
        # get value or only customized value
        my $value = quote($value_obj->fetch (mode => $fetch_mode, check => 
$check)) ;
-       $index = quote($index) ;
+       $index = id_quote($index) ;
 
         my $pad = $compute_pad->($node);
 
@@ -106,7 +115,7 @@ sub dump_tree {
        # get value or only customized value
        my $value = $value_obj->fetch (mode => $fetch_mode, check => $check) ;
        my $qvalue = quote($value) ;
-       $index = quote($index) ;
+       $index = id_quote($index) ;
         my $pad = $compute_pad->($node);
 
         my $name = defined $index ? "$element:$index" 
@@ -141,7 +150,7 @@ sub dump_tree {
                 $$data_r .= "\n$pad$element:$idx#".note_quote($note) if $note ;
             }
            # skip undef values
-           my @val = quote( grep (defined $_, 
+           my @val = id_quote( grep (defined $_,
                                   $list_obj->fetch_all_values(mode => 
$fetch_mode, 
                                                               check => 
$check))) ;
             $$data_r .= "\n$pad$element:=" . join( ',', @val ) if @val;
@@ -183,7 +192,7 @@ sub dump_tree {
         my $node_note = note_quote($contained_node->annotation) ;
        
        if ($type eq 'list' or $type eq 'hash') {
-           $head .= ':'.quote($key) ;
+           $head .= ':'.id_quote($key) ;
            $head .= '#'.$node_note if $node_note ;
             my $sub_data = '';
             $scanner->scan_node(\$sub_data, $contained_node);
@@ -242,7 +251,7 @@ Config::Model::Dumper - Serialize data of config tree
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Exception.pm b/lib/Config/Model/Exception.pm
index bd9704f..7dcdaec 100644
--- a/lib/Config/Model/Exception.pm
+++ b/lib/Config/Model/Exception.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Exception;
-$Config::Model::Exception::VERSION = '2.053';
+$Config::Model::Exception::VERSION = '2.054';
 use warnings;
 use strict;
 use Data::Dumper;
@@ -143,7 +143,7 @@ use Exception::Class (
 Config::Model::Exception::Internal->Trace(1);
 
 package Config::Model::Exception::Syntax;
-$Config::Model::Exception::Syntax::VERSION = '2.053';
+$Config::Model::Exception::Syntax::VERSION = '2.054';
 
 sub full_message {
     my $self = shift;
@@ -158,7 +158,7 @@ sub full_message {
 }
 
 package Config::Model::Exception::Any;
-$Config::Model::Exception::Any::VERSION = '2.053';
+$Config::Model::Exception::Any::VERSION = '2.054';
 
 sub full_message {
     my $self = shift;
@@ -188,7 +188,7 @@ sub xpath_message {
 }
 
 package Config::Model::Exception::LoadData;
-$Config::Model::Exception::LoadData::VERSION = '2.053';
+$Config::Model::Exception::LoadData::VERSION = '2.054';
 
 
 sub full_message {
@@ -207,7 +207,7 @@ sub full_message {
 }
 
 package Config::Model::Exception::Model;
-$Config::Model::Exception::Model::VERSION = '2.053';
+$Config::Model::Exception::Model::VERSION = '2.054';
 
 
 sub full_message {
@@ -236,7 +236,7 @@ sub full_message {
 }
 
 package Config::Model::Exception::Load;
-$Config::Model::Exception::Load::VERSION = '2.053';
+$Config::Model::Exception::Load::VERSION = '2.054';
 
 
 sub full_message {
@@ -258,7 +258,7 @@ sub full_message {
 }
 
 package Config::Model::Exception::RestrictedElement;
-$Config::Model::Exception::RestrictedElement::VERSION = '2.053';
+$Config::Model::Exception::RestrictedElement::VERSION = '2.054';
 
 
 sub full_message {
@@ -275,7 +275,7 @@ sub full_message {
 }
 
 package Config::Model::Exception::UnavailableElement;
-$Config::Model::Exception::UnavailableElement::VERSION = '2.053';
+$Config::Model::Exception::UnavailableElement::VERSION = '2.054';
 
 
 sub full_message {
@@ -301,7 +301,7 @@ sub full_message {
 }
 
 package Config::Model::Exception::ObsoleteElement;
-$Config::Model::Exception::ObsoleteElement::VERSION = '2.053';
+$Config::Model::Exception::ObsoleteElement::VERSION = '2.054';
 
 
 sub full_message {
@@ -321,7 +321,7 @@ sub full_message {
 }
 
 package Config::Model::Exception::UnknownElement;
-$Config::Model::Exception::UnknownElement::VERSION = '2.053';
+$Config::Model::Exception::UnknownElement::VERSION = '2.054';
 
 use Carp;
 
@@ -392,7 +392,7 @@ sub full_message {
 }
 
 package Config::Model::Exception::UnknownId;
-$Config::Model::Exception::UnknownId::VERSION = '2.053';
+$Config::Model::Exception::UnknownId::VERSION = '2.054';
 
 
 sub full_message {
@@ -422,7 +422,7 @@ sub full_message {
 }
 
 package Config::Model::Exception::WrongType;
-$Config::Model::Exception::WrongType::VERSION = '2.053';
+$Config::Model::Exception::WrongType::VERSION = '2.054';
 
 
 sub full_message {
@@ -448,7 +448,7 @@ sub full_message {
 }
 
 package Config::Model::Exception::ConfigFile::Missing ;
-$Config::Model::Exception::ConfigFile::Missing::VERSION = '2.053';
+$Config::Model::Exception::ConfigFile::Missing::VERSION = '2.054';
 
 
 sub full_message {
@@ -460,7 +460,7 @@ sub full_message {
 }
 
 package Config::Model::Exception::Xml;
-$Config::Model::Exception::Xml::VERSION = '2.053';
+$Config::Model::Exception::Xml::VERSION = '2.054';
 
 
 sub full_message {
@@ -491,7 +491,7 @@ Config::Model::Exception - Exception mechanism for 
configuration model
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/FuseUI.pm b/lib/Config/Model/FuseUI.pm
index a949173..7437393 100644
--- a/lib/Config/Model/FuseUI.pm
+++ b/lib/Config/Model/FuseUI.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::FuseUI ;
-$Config::Model::FuseUI::VERSION = '2.053';
+$Config::Model::FuseUI::VERSION = '2.054';
 # there's no Singleton with Mouse
 use Mouse ;
 
@@ -317,7 +317,7 @@ Config::Model::FuseUI - Fuse virtual file interface for 
Config::Model
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/HashId.pm b/lib/Config/Model/HashId.pm
index 02d67d3..cc55de3 100644
--- a/lib/Config/Model/HashId.pm
+++ b/lib/Config/Model/HashId.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::HashId ;
-$Config::Model::HashId::VERSION = '2.053';
+$Config::Model::HashId::VERSION = '2.054';
 use Mouse ;
 use namespace::autoclean;
 
@@ -492,7 +492,7 @@ Config::Model::HashId - Handle hash element for 
configuration model
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/IdElementReference.pm 
b/lib/Config/Model/IdElementReference.pm
index c9f86c4..cf8ca28 100644
--- a/lib/Config/Model/IdElementReference.pm
+++ b/lib/Config/Model/IdElementReference.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::IdElementReference;
-$Config::Model::IdElementReference::VERSION = '2.053';
+$Config::Model::IdElementReference::VERSION = '2.054';
 use Mouse;
 use namespace::autoclean;
 
@@ -197,7 +197,7 @@ Config::Model::IdElementReference - Refer to id element(s) 
and extract keys
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Instance.pm b/lib/Config/Model/Instance.pm
index 923e6ea..06cacd7 100644
--- a/lib/Config/Model/Instance.pm
+++ b/lib/Config/Model/Instance.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Instance;
-$Config::Model::Instance::VERSION = '2.053';
+$Config::Model::Instance::VERSION = '2.054';
 #use Scalar::Util qw(weaken) ;
 
 use 5.10.1;
@@ -493,7 +493,7 @@ Config::Model::Instance - Instance of configuration tree
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Iterator.pm b/lib/Config/Model/Iterator.pm
index 65589a8..47f5092 100644
--- a/lib/Config/Model/Iterator.pm
+++ b/lib/Config/Model/Iterator.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Iterator ;
-$Config::Model::Iterator::VERSION = '2.053';
+$Config::Model::Iterator::VERSION = '2.054';
 use Carp;
 use strict;
 use warnings ;
@@ -275,7 +275,7 @@ Config::Model::Iterator - Iterates forward or backward a 
configuration tree
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/ListId.pm b/lib/Config/Model/ListId.pm
index 095edae..a1aae26 100644
--- a/lib/Config/Model/ListId.pm
+++ b/lib/Config/Model/ListId.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::ListId ;
-$Config::Model::ListId::VERSION = '2.053';
+$Config::Model::ListId::VERSION = '2.054';
 use 5.10.1;
 use Mouse ;
 use namespace::autoclean;
@@ -369,17 +369,24 @@ sub sort {
     my $self = shift;
 
     $self->_assert_leaf_cargo;
-    $self->_sort_data(sub{$_[0]->fetch cmp $_[1]->fetch});
-    $self->_reindex;
+     ;
+    $self->_sort_data( sub { $_[0]->fetch cmp $_[1]->fetch; });
+
+    my $has_changed = $self->_reindex;
+    $self->notify_change(note => "sorted") if $has_changed ;
 }
 
 sub _reindex {
     my $self = shift;
 
     my $i = 0;
+    my $has_changed = 0;
     foreach my $o ($self->_all_data) {
-        $o->index_value($i++) if defined $o;
+        next unless defined $o;
+        $has_changed =1 if $o->index_value != $i;
+        $o->index_value($i++);
     }
+    return $has_changed;
 }
 
 sub swap {
@@ -503,7 +510,7 @@ Config::Model::ListId - Handle list element for 
configuration model
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Lister.pm b/lib/Config/Model/Lister.pm
index adf228b..dabc8c9 100644
--- a/lib/Config/Model/Lister.pm
+++ b/lib/Config/Model/Lister.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Lister;
-$Config::Model::Lister::VERSION = '2.053';
+$Config::Model::Lister::VERSION = '2.054';
 
 use strict;
 use warnings;
@@ -86,7 +86,7 @@ Config::Model::Lister - List available models and applications
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Loader.pm b/lib/Config/Model/Loader.pm
index bb7ad17..0c4607a 100644
--- a/lib/Config/Model/Loader.pm
+++ b/lib/Config/Model/Loader.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Loader;
-$Config::Model::Loader::VERSION = '2.053';
+$Config::Model::Loader::VERSION = '2.054';
 use Carp;
 use strict;
 use warnings ;
@@ -130,8 +130,10 @@ sub _split_cmd {
                   (?: \( ([^)]+)  \) )  # capture parameters between braces
                 | (
                     /[^/]+/      # regexp
-                    | $quoted_string
-                    | [^#=\.<>]+    # non action chars
+                    | (?:
+                       $quoted_string
+                       | [^#=\.<>]+    # non action chars
+                      )+
                   )
             )?
          )?
@@ -155,7 +157,6 @@ sub _split_cmd {
         )?
          !gx
        ) ;
-    unquote (@command) ;
 
     return wantarray ? @command : \@command ;
 }
@@ -283,6 +284,7 @@ sub _load {
 
        $logger->debug("_load: calling $element_type loader on element 
$element_name") ;
        my $ret = $self->$method($node, $check,$experience, 
\@instructions,$cmdref) ;
+        die "Internal error: method dispatched for $element_type returned an 
undefined value " unless defined $ret;
 
        if ($ret eq 'error' or $ret eq 'done') { 
            $logger->debug("_load return: $node_name got $ret");
@@ -301,6 +303,8 @@ sub _load {
 sub _load_note {
     my ( $self, $target_obj, $note, $instructions, $cmdref) = @_;
 
+    unquote($note);
+
     # apply note on target object
     if ( defined $note ) {
         if ( defined $target_obj ) {
@@ -499,13 +503,16 @@ sub _load_list {
        return 'ok';
     }
 
+    unquote($id,$value,$note);
+
     if (defined $action) {
         my $dispatch
             = $dispatch_action{'list_'.$cargo_type}{$action}
             || $dispatch_action{$cargo_type}{$action}
             || $dispatch_action{'fallback'}{$action};
         if ($dispatch) {
-            return $dispatch->($self,$element,$check, $inst, @f_args) ;
+            $dispatch->($self,$element,$check, $inst, @f_args) ;
+            return 'ok';
         }
     }
 
@@ -519,6 +526,7 @@ sub _load_list {
     }
 
     if (defined $action and $action eq ':') {
+        unquote($id);
        my $obj = $element->fetch_with_id(index => $id, check => $check) ;
         $self->_load_note($obj, $note, $inst, $cmdref);
 
@@ -554,6 +562,8 @@ sub _load_hash {
     my ($self,$node,$check,$experience,$inst,$cmdref) = @_ ;
     my ($element_name,$action,$f_arg,$id,$subaction,$value,$note) = @$inst ;
 
+    unquote($id,$value,$note);
+
     my $element = $node -> fetch_element(name => $element_name, check => 
$check ) ;
     my $cargo_type = $element->cargo_type ;
 
@@ -573,7 +583,7 @@ sub _load_hash {
 
     if ($action eq ':~') {
        my @keys = $element->fetch_all_indexes;
-       my $ret ;
+       my $ret = 'ok';
        $logger->debug("_load_hash: looping with regex $id on keys @keys");
        $id =~ s!^/!!;
        $id =~ s!/$!! ;
@@ -610,7 +620,8 @@ sub _load_hash {
             || $dispatch_action{$cargo_type}{$action}
             || $dispatch_action{'fallback'}{$action};
         if ($dispatch) {
-            return $dispatch->($self,$element,$check,$inst,$id) ;
+            $dispatch->($self,$element,$check,$inst,$id) ;
+            return 'ok';
         }
     }
 
@@ -654,6 +665,8 @@ sub _load_leaf {
     my ($self,$node,$check,$experience,$inst,$cmdref) = @_ ;
     my ($element_name,$action,$f_arg,$id,$subaction,$value,$note) = @$inst ;
 
+    unquote($id,$value);
+
     my $element = $node -> fetch_element(name => $element_name, check => 
$check) ;
     $self->_load_note($element, $note, $inst, $cmdref);
 
@@ -730,7 +743,7 @@ Config::Model::Loader - Load serialized data into config 
tree
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Manual/ModelCreationAdvanced.pod 
b/lib/Config/Model/Manual/ModelCreationAdvanced.pod
index 95edfd2..c33ce09 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.053
+version 2.054
 
 =head1 Introduction
 
diff --git a/lib/Config/Model/Manual/ModelCreationIntroduction.pod 
b/lib/Config/Model/Manual/ModelCreationIntroduction.pod
index cee026f..a72eca9 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.053
+version 2.054
 
 =head1 Introduction
 
diff --git a/lib/Config/Model/Node.pm b/lib/Config/Model/Node.pm
index cbafd8e..5109abe 100644
--- a/lib/Config/Model/Node.pm
+++ b/lib/Config/Model/Node.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Node;
-$Config::Model::Node::VERSION = '2.053';
+$Config::Model::Node::VERSION = '2.054';
 use Mouse ;
 use namespace::autoclean;
 
@@ -1254,7 +1254,7 @@ Config::Model::Node - Class for configuration tree node
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/ObjTreeScanner.pm 
b/lib/Config/Model/ObjTreeScanner.pm
index 7a4b3ea..906fb4b 100644
--- a/lib/Config/Model/ObjTreeScanner.pm
+++ b/lib/Config/Model/ObjTreeScanner.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::ObjTreeScanner ;
-$Config::Model::ObjTreeScanner::VERSION = '2.053';
+$Config::Model::ObjTreeScanner::VERSION = '2.054';
 use strict ;
 use Config::Model::Exception ;
 use Scalar::Util qw/blessed/ ;
@@ -307,7 +307,7 @@ Config::Model::ObjTreeScanner - Scan config tree and 
perform call-backs for each
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Report.pm b/lib/Config/Model/Report.pm
index 671e9f6..0f7cd41 100644
--- a/lib/Config/Model/Report.pm
+++ b/lib/Config/Model/Report.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Report;
-$Config::Model::Report::VERSION = '2.053';
+$Config::Model::Report::VERSION = '2.054';
 use Carp;
 use strict;
 use warnings ;
@@ -94,7 +94,7 @@ Config::Model::Report - Reports data from config tree
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/SearchElement.pm 
b/lib/Config/Model/SearchElement.pm
index 238a26f..dc52a90 100644
--- a/lib/Config/Model/SearchElement.pm
+++ b/lib/Config/Model/SearchElement.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::SearchElement;
-$Config::Model::SearchElement::VERSION = '2.053';
+$Config::Model::SearchElement::VERSION = '2.054';
 use Log::Log4perl qw(get_logger :levels);
 use Carp;
 use strict;
@@ -351,7 +351,7 @@ Config::Model::SearchElement - Search an element in a 
configuration model
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/SimpleUI.pm b/lib/Config/Model/SimpleUI.pm
index 5aac14d..1a4a7e4 100644
--- a/lib/Config/Model/SimpleUI.pm
+++ b/lib/Config/Model/SimpleUI.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::SimpleUI ;
-$Config::Model::SimpleUI::VERSION = '2.053';
+$Config::Model::SimpleUI::VERSION = '2.054';
 use Carp;
 use strict ;
 use warnings ;
@@ -280,7 +280,7 @@ Config::Model::SimpleUI - Simple interface for Config::Model
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/TermUI.pm b/lib/Config/Model/TermUI.pm
index e0f8936..22c17fd 100644
--- a/lib/Config/Model/TermUI.pm
+++ b/lib/Config/Model/TermUI.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::TermUI ;
-$Config::Model::TermUI::VERSION = '2.053';
+$Config::Model::TermUI::VERSION = '2.054';
 use Carp;
 use strict ;
 use warnings ;
@@ -225,7 +225,7 @@ Config::Model::TermUI - Provides Config::Model UI with 
Term::ReadLine
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/TreeSearcher.pm b/lib/Config/Model/TreeSearcher.pm
index 8c173fb..10a7be1 100644
--- a/lib/Config/Model/TreeSearcher.pm
+++ b/lib/Config/Model/TreeSearcher.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::TreeSearcher ;
-$Config::Model::TreeSearcher::VERSION = '2.053';
+$Config::Model::TreeSearcher::VERSION = '2.054';
 use Mouse ;
 use Mouse::Util::TypeConstraints;
 use namespace::autoclean;
@@ -148,7 +148,7 @@ Config::Model::TreeSearcher - Search tree for match in 
value, description...
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Value.pm b/lib/Config/Model/Value.pm
index c3a45e8..b2c2e83 100644
--- a/lib/Config/Model/Value.pm
+++ b/lib/Config/Model/Value.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Value ;
-$Config::Model::Value::VERSION = '2.053';
+$Config::Model::Value::VERSION = '2.054';
 use 5.10.1 ;
 
 use Mouse;
@@ -1911,7 +1911,7 @@ Config::Model::Value - Strongly typed configuration value
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Value/LayeredInclude.pm 
b/lib/Config/Model/Value/LayeredInclude.pm
index 127d137..3f36101 100644
--- a/lib/Config/Model/Value/LayeredInclude.pm
+++ b/lib/Config/Model/Value/LayeredInclude.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Value::LayeredInclude;
-$Config::Model::Value::LayeredInclude::VERSION = '2.053';
+$Config::Model::Value::LayeredInclude::VERSION = '2.054';
 
 use 5.010;
 use strict;
@@ -109,7 +109,7 @@ Config::Model::Value::LayeredInclude - Include a sub layer 
configuration
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/ValueComputer.pm 
b/lib/Config/Model/ValueComputer.pm
index bb211c1..9aca5fd 100644
--- a/lib/Config/Model/ValueComputer.pm
+++ b/lib/Config/Model/ValueComputer.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::ValueComputer ;
-$Config::Model::ValueComputer::VERSION = '2.053';
+$Config::Model::ValueComputer::VERSION = '2.054';
 use Mouse ;
 use MouseX::StrictConstructor;
 use namespace::autoclean;
@@ -583,7 +583,7 @@ Config::Model::ValueComputer - Provides configuration value 
computation
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/WarpedNode.pm b/lib/Config/Model/WarpedNode.pm
index 124a3ec..f60bf98 100644
--- a/lib/Config/Model/WarpedNode.pm
+++ b/lib/Config/Model/WarpedNode.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::WarpedNode ;
-$Config::Model::WarpedNode::VERSION = '2.053';
+$Config::Model::WarpedNode::VERSION = '2.054';
 use Mouse ;
 
 use Carp qw(cluck croak);
@@ -313,7 +313,7 @@ Config::Model::WarpedNode - Node that change config class 
properties
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/lib/Config/Model/Warper.pm b/lib/Config/Model/Warper.pm
index c43ac77..5e89f29 100644
--- a/lib/Config/Model/Warper.pm
+++ b/lib/Config/Model/Warper.pm
@@ -8,7 +8,7 @@
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Warper ;
-$Config::Model::Warper::VERSION = '2.053';
+$Config::Model::Warper::VERSION = '2.054';
 use Mouse ;
 use namespace::autoclean;
 
@@ -601,7 +601,7 @@ Config::Model::Warper - Warp tree properties
 
 =head1 VERSION
 
-version 2.053
+version 2.054
 
 =head1 SYNOPSIS
 
diff --git a/script/cme b/script/cme
index b73dfaa..683faff 100644
--- a/script/cme
+++ b/script/cme
@@ -57,7 +57,7 @@ my $dumptype;
 my $load;
 my @fix_from;
 my $fix_filter ;
-my $request_save  = 0;
+my $force_save  = 0;
 my $open_item   = '';
 my $fuse_dir;
 my $fuse_debug  = 0;
@@ -109,7 +109,7 @@ my @global_options = (
     "backend=s"                     => \$backend,
     "stack-trace|trace!"            => \$trace,
     "backup:s"                      => \$backup,
-    "save!"                         => \$request_save,
+    "save!"                         => \$force_save,
     "strict!"                       => \$strict,
     );
 
@@ -231,6 +231,7 @@ my $inst = $model->instance(
 );
 
 my $root = $inst->config_root;
+my $request_save  = 0;
 
 if ( $command eq  'dump' ) {
     my $dump_string = $root->dump_tree( mode => $dumptype || 'custom' );
@@ -435,7 +436,7 @@ if ($request_save) {
     $inst->say_changes;
     # if load was forced, must write back to clean up errors (even if they are 
not changes
     # at semantic level, i.e. removed unnecessary stuff)
-    $inst->write_back(force => $force_load)  ;
+    $inst->write_back(force => $force_load || $force_save)  ;
 }
 
 my $ouch = $inst->has_warning ;
diff --git a/t/array_id.t b/t/array_id.t
index d5e9a69..66af42c 100644
--- a/t/array_id.t
+++ b/t/array_id.t
@@ -413,8 +413,12 @@ $pl->clear ;
 # test sort
 @set = qw/j h g f/ ;
 $pl->store_set(@set);
+$inst->clear_changes ;
 $pl->sort;
 eq_or_diff( [ $pl->fetch_all_values ], [sort @set] ,"check sort result");
+is($inst->c_count, 1, "check that sort has triggered a change") ;
+$pl->sort;
+is($inst->c_count, 1, "check that redundant sort has not triggered a change") ;
 
 # test unshift
 @set = qw/j h g f/ ;
diff --git a/t/dump_load_model.pm b/t/dump_load_model.pm
index 9127b41..8d08df1 100644
--- a/t/dump_load_model.pm
+++ b/t/dump_load_model.pm
@@ -107,7 +107,7 @@
                           cargo_type => 'node',
                           config_class_name => 'SlaveZ' ,
                         },
-              [qw/lista listb/] => { type => 'list',
+              [qw/lista listb listc/] => { type => 'list',
                                      cargo_type => 'leaf',
                                      cargo_args => {value_type => 'string'},
                                    },
@@ -162,6 +162,9 @@
               a_string => { type => 'leaf',
                             value_type => 'string'
                           },
+              a_string2 => { type => 'leaf',
+                            value_type => 'string'
+                          },
               another_string => { type => 'leaf',
                             mandatory => 1 ,
                             value_type => 'string'
diff --git a/t/dump_tree.t b/t/dump_tree.t
index 3aa9a40..fceac59 100644
--- a/t/dump_tree.t
+++ b/t/dump_tree.t
@@ -1,8 +1,9 @@
 # -*- cperl -*-
 
 use ExtUtils::testlib;
-use Test::More tests => 22;
+use Test::More;
 use Test::Memory::Cycle;
+use Test::Differences;
 use Config::Model;
 
 use warnings;
@@ -45,23 +46,23 @@ ok( $root->load( step => $step, experience => 'advanced' ),
 $inst->preset_stop ;
 
 $step = 'std_id:ab X=Bv - std_id:bc X=Av - std_id:"b d " X=Av '
-  .'- a_string="toto \"titi\" tata" another_string="foobar" '
-  .'lista:=a,b,c,d olist:0 X=Av - olist:1 X=Bv - listb:=b,"c c2",d '
+  .'- a_string="toto \"titi\" tata" another_string="foobar" 
a_string2=d...@foo.com '
+  .'lista:=a,b,c,d olist:0 X=Av - olist:1 X=Bv - listb:=b,"c c2",d 
listc:="d...@foo.com" '
   . '! hash_a:X2=x hash_a:Y2=xy  hash_b:X3=xy my_check_list=X2,X3' ;
 ok( $root->load( step => $step, experience => 'advanced' ),
   "set up data in tree");
 
-is_deeply([ sort $root->fetch_element('std_id')->fetch_all_indexes ],
+eq_or_diff([ sort $root->fetch_element('std_id')->fetch_all_indexes ],
          ['ab','b d ','bc'], "check std_id keys" ) ;
 
-is_deeply([ sort $root->fetch_element('lista')->fetch_all_values(mode => 
'custom') ],
+eq_or_diff([ sort $root->fetch_element('lista')->fetch_all_values(mode => 
'custom') ],
          [qw/c d/], "check lista custom values" ) ;
 
 my $cds = $root->dump_tree;
 
 print "cds string:\n$cds" if $trace ;
 
-my $expect = <<'EOF' ;
+my $orig_expect = <<'EOF' ;
 std_id:ab -
 std_id:"b d "
   X=Av -
@@ -69,6 +70,7 @@ std_id:bc
   X=Av -
 lista:=c,d
 listb:="c c2",d
+listc:="d...@foo.com"
 hash_a:X2=x
 hash_a:Y2=xy
 hash_b:X3=xy
@@ -77,18 +79,19 @@ olist:0
 olist:1
   X=Bv -
 a_string="toto \"titi\" tata"
+a_string2=d...@foo.com
 another_string=foobar
 my_check_list=X2,X3 -
 EOF
 
 $cds =~ s/\s+\n/\n/g;
-is_deeply( [split /\n/,$cds], [split /\n/,$expect], 
+eq_or_diff( [split /\n/,$cds], [split /\n/,$orig_expect], 
           "check dump of only customized values ") ;
 
 $cds = $root->dump_tree( full_dump => 1 );
 print "cds string:\n$cds" if $trace  ;
 
-$expect = <<'EOF' ;
+my $expect = <<'EOF' ;
 std_id:ab
   X=Bv
   DX=Dv -
@@ -100,6 +103,7 @@ std_id:bc
   DX=Dv -
 lista:=a,b,c,d
 listb:=b,"c c2",d
+listc:="d...@foo.com"
 hash_a:X2=x
 hash_a:Y2=xy
 hash_b:X3=xy
@@ -112,13 +116,14 @@ olist:1
 string_with_def="yada yada"
 a_uniline="yada yada"
 a_string="toto \"titi\" tata"
+a_string2=d...@foo.com
 another_string=foobar
 int_v=10
 my_check_list=X2,X3 -
 EOF
 
 $cds =~ s/\s+\n/\n/g;
-is_deeply( [split /\n/,$cds], [split /\n/,$expect], 
+eq_or_diff( [split /\n/,$cds], [split /\n/,$expect], 
           "check dump of all values ") ;
 
 my $listb = $root->fetch_element('listb');
@@ -138,6 +143,7 @@ std_id:bc
   X=Av
   DX=Dv -
 lista:=a,b,c,d
+listc:="d...@foo.com"
 hash_a:X2=x
 hash_a:Y2=xy
 hash_b:X3=xy
@@ -150,13 +156,14 @@ olist:1
 string_with_def="yada yada"
 a_uniline="yada yada"
 a_string="toto \"titi\" tata"
+a_string2=d...@foo.com
 another_string=foobar
 int_v=10
 my_check_list=X2,X3 -
 EOF
 
 $cds =~ s/\s+\n/\n/g;
-is_deeply( [split /\n/,$cds], [split /\n/,$expect], 
+eq_or_diff( [split /\n/,$cds], [split /\n/,$expect], 
           "check dump of all values after listb is cleared") ;
 
 
@@ -176,6 +183,7 @@ std_id:bc
   X=Av
   DX=Dv -
 lista:=a,b,c,d
+listc:="d...@foo.com"
 hash_a:X2=x
 hash_a:Y2=xy
 hash_b:X3=xy
@@ -188,6 +196,7 @@ olist:1
 string_with_def="yada yada"
 a_uniline="yada yada"
 a_string=""
+a_string2=d...@foo.com
 another_string=foobar
 int_v=10
 my_check_list=X2,X3 -
@@ -197,7 +206,7 @@ $cds = $root->dump_tree( full_dump => 1 );
 print "cds string:\n$cds" if $trace  ;
 
 $cds =~ s/\s+\n/\n/g;
-is_deeply( [split /\n/,$cds], [split /\n/,$expect], 
+eq_or_diff( [split /\n/,$cds], [split /\n/,$expect], 
           "check dump of all values after a_string is set to ''") ;
 
 # check preset values
@@ -216,7 +225,7 @@ olist:1 - -
 EOF
 
 $cds =~ s/\s+\n/\n/g;
-is_deeply( [split /\n/,$cds], [split /\n/,$expect], 
+eq_or_diff( [split /\n/,$cds], [split /\n/,$expect], 
           "check dump of all preset values") ;
 
 # shake warp stuff
@@ -237,6 +246,17 @@ print "Empty listb dump:\n$cds" if $trace  ;
 
 unlike($cds,qr/listb/,"check that listb containing undef values is not shown") 
;
 
+# reload test
+
+my $reload_root = $model->instance (root_class_name => 'Master', 
+                                    instance_name => 'reload_test') -> 
config_root ;
+
+$reload_root->load($orig_expect);
+my $reloaded_dump = $reload_root -> dump_tree;
+eq_or_diff( [split /\n/,$reloaded_dump], [split /\n/,$orig_expect], 
+          "check dump of tree load with dump result") ;
+
+
 # annotation tests
 
 my $root2 = $model->instance (root_class_name => 'Master', 
@@ -275,4 +295,8 @@ my $cds2 = $root3->dump_tree( full_dump => 1 );
 print "Dump second instance with annotations:\n$cds2" if $trace  ;
 
 is($cds2,$cds,"check both dumps") ;
-memory_cycle_ok($model);
+
+
+memory_cycle_ok($model,"memory cycles");
+
+done_testing;
\ No newline at end of file
diff --git a/t/load.t b/t/load.t
index 03c693c..bad34cc 100644
--- a/t/load.t
+++ b/t/load.t
@@ -51,30 +51,33 @@ my @regexp_test
      # string         elt_name   op   (param) id     op     val      note
      [ 'a'               , ['a', 'x' ,   'x', 'x'    ,'x' , 'x'     , 'x'  ]],
      [ '#C'              , ['x', 'x' ,   'x', 'x'    ,'x' , 'x'     , 'C'  ]],
-     [ '#"m C"'          , ['x', 'x' ,   'x', 'x'    ,'x' , 'x'     , 'm C']],
+     [ '#"m C"'          , ['x', 'x' ,   'x', 'x'    ,'x' , 'x'     , '"m 
C"']],
      [ 'a=b'             , ['a', 'x' ,   'x', 'x'    ,'=' , 'b'     , 'x'  ]],
      [ 'a-z=b'           , ['a-z','x' ,  'x', 'x'    ,'=' , 'b'     , 'x'  ]],
      [ "a=\x{263A}"      , ['a', 'x' ,   'x', 'x'    ,'=' , "\x{263A}" , 'x'  
]], # utf8 smiley
      [ 'a.=b'            , ['a', 'x' ,   'x', 'x'    ,'.=','b'      , 'x'  ]],
      [ "a.=\x{263A}"     , ['a', 'x' ,   'x', 'x'    ,'.=', "\x{263A}" , 'x'  
]], # utf8 smiley
-     [ 'a="b=c"'         , ['a', 'x' ,   'x', 'x'    ,'=' , 'b=c'   , 'x'  ]],
-     [ 'a="b=\"c\""'     , ['a', 'x' ,   'x', 'x'    ,'=' , 'b="c"' , 'x'  ]],
+     [ 'a="b=c"'         , ['a', 'x' ,   'x', 'x'    ,'=' , '"b=c"'   , 'x'  
]],
+     [ 'a="b=\"c\""'     , ['a', 'x' ,   'x', 'x'    ,'=' , '"b=\"c\""' , 'x'  
]],
      [ 'a=~/a/A/'        , ['a', 'x' ,   'x', 'x'    ,'=~', '/a/A/' , 'x'  ]], 
# subst on value
      [ 'a=b#B'           , ['a', 'x' ,   'x', 'x'    ,'=' , 'b'     , 'B'  ]],
      [ 'a#B'             , ['a', 'x' ,   'x', 'x'    ,'x' , 'x'     , 'B'  ]],
-     [ 'a#"b=c"'         , ['a', 'x' ,   'x', 'x'    ,'x' , 'x'     , 'b=c']],
+     [ 'a#"b=c"'         , ['a', 'x' ,   'x', 'x'    ,'x' , 'x'     , 
'"b=c"']],
 
      [ 'a:b=c'           , ['a', ':' ,   'x', 'b'    ,'=' , 'c'     , 'x'  ]], 
# fetch and assign elt
-     [ 'a:"b\""="\"c"'   , ['a', ':' ,   'x', 'b"'   ,'=' ,'"c'     , 'x'  ]], 
# fetch and assign elt qith quotes
+     [ 'a:"b\""="\"c"'   , ['a', ':' ,   'x', '"b\""' ,'=' ,'"\"c"'     , 'x'  
]], # fetch and assign elt qith quotes
      [ 'a:~/b.*/'        , ['a', ':~',   'x','/b.*/' ,'x' , 'x'     , 'x'  ]], 
# loop on matched value
-     [ 'a:~/b.*/.="\"a"' , ['a', ':~',   'x','/b.*/' ,'.=','"a'     , 'x'  ]], 
# loop on matched value and append
+     [ 'a:~/b.*/.="\"a"' , ['a', ':~',   'x','/b.*/' ,'.=','"\"a"'  , 'x'  ]], 
# loop on matched value and append
      [ 'a:~/^\w+$/'      , ['a', ':~',   'x','/^\w+$/','x','x'     ,  'x'  ]], 
# loop on matched value
+     [ 'a:="d...@foo.com"'  , ['a', ':=' ,  'x','"d...@foo.com"','x','x',   
'x'  ]], # set list
      [ 'a:=b,c,d'        , ['a', ':=' ,  'x','b,c,d', 'x' , 'x',      'x'  ]], 
# set list
      [ 'a=b,c,d'         , ['a',  'x' ,  'x',  'x',   '=', 'b,c,d',   'x'  ]], 
# set list old style
      [ 'm:=a,"a b "'     , ['m', ':=' ,  'x','a,"a b "','x','x'    ,  'x'  ]], 
# set list with quotes
+     [ 'm:="a b ",c'     , ['m', ':=' ,  'x','"a b ",c','x','x'    ,  'x'  ]], 
# set list with quotes
+     [ 'm:="a b","c d"'  , ['m', ':=' ,  'x','"a b","c d"','x','x'    ,  'x'  
]], # set list with quotes
      [ 'm=a,"a b "'      , ['m', 'x' ,   'x', 'x',   '=', 'a,"a b "' ,'x'  ]], 
# set list with quotes, old style
      [ 'a:b#C'           , ['a', ':' ,   'x', 'b'    ,'x' , 'x'     , 'C'  ]], 
# fetch elt and add comment
-     [ 'a:"b\""#"\"c"'   , ['a', ':' ,   'x', 'b"'   ,'x' , 'x'     ,'"c'  ]], 
# fetch elt and add comment with quotes
+     [ 'a:"b\""#"\"c"'   , ['a', ':' ,   'x', '"b\""','x' , 'x'     ,'"\"c"'  
]], # fetch elt and add comment with quotes
      [ 'a:b=c#C'         , ['a', ':' ,   'x', 'b'    ,'=' , 'c'     , 'C'  ]], 
# fetch and assign elt and add comment
      [ 'a:-'             , ['a', ':-',   'x', 'x'    ,'x' , 'x'     , 'x'  ]], 
# empty list
      [ 'a:-b'            , ['a', ':-',   'x', 'b'    ,'x' , 'x'     , 'x'  ]], 
# remove id b
@@ -184,7 +187,7 @@ $step = 'lista:=a,b,c,d lista:4=e olist:0 X=Av - olist:1 
X=Bv - listb:=b,c,d,,f,
 throws_ok { $root->load( step => $step, experience => 'advanced');} 
   qr/comma/, "load wrong '$step'";
 
-$step = 'listb:=b,c,d,f,"",h,0';
+$step = 'listb:=b,c,d,f,"",h,0 listc:="d...@foo.com"';
 ok ( $root->load( step => $step, experience => 'advanced'),
      "load '$step'");
 

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

_______________________________________________
Pkg-perl-cvs-commits mailing list
Pkg-perl-cvs-commits@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits

Reply via email to