[libconfig-model-itself-perl] 02/11: New upstream version 2.007

dod at debian.org dod at debian.org
Sat Mar 11 18:27:16 UTC 2017


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

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

commit 257cdc6ea44e1ef3dc02d574f3514806cda4e3d6
Author: Dominique Dumont <dod at debian.org>
Date:   Sat Mar 11 18:07:55 2017 +0100

    New upstream version 2.007
---
 Build.PL                                           |   9 +-
 Changes                                            |  23 ++
 LICENSE                                            |   2 +-
 MANIFEST                                           |   4 +-
 META.json                                          |  14 +-
 META.yml                                           |  12 +-
 README-build-from-git.md                           |  56 +++
 README.md                                          |  10 +-
 config-model-edit                                  | 438 ---------------------
 data/models/MasterModel.pl                         |   2 +-
 data/models/MasterModel/CheckListExamples.pl       |   2 +-
 data/models/MasterModel/HashIdOfValues.pl          |   2 +-
 data/models/MasterModel/References.pl              |   2 +-
 data/models/MasterModel/WarpedId.pl                |   2 +-
 data/models/MasterModel/WarpedValues.pl            |   2 +-
 data/models/MasterModel/X_base_class.pl            |   2 +-
 lib/App/Cme/Command/meta.pm                        |  62 +--
 lib/Config/Model/Itself.pm                         |  84 ++--
 lib/Config/Model/Itself/BackendDetector.pm         |   8 +-
 lib/Config/Model/Itself/TkEditUI.pm                |   4 +-
 lib/Config/Model/models/Itself/Application.pl      |  12 +-
 lib/Config/Model/models/Itself/CargoElement.pl     |   2 +-
 lib/Config/Model/models/Itself/Class.pl            |  44 ++-
 lib/Config/Model/models/Itself/Class.pod           |  10 +-
 lib/Config/Model/models/Itself/CommonElement.pl    |  24 +-
 .../Model/models/Itself/CommonElement/Assert.pod   |   6 +-
 .../models/Itself/CommonElement/WarnIfMatch.pod    |   4 +-
 lib/Config/Model/models/Itself/ComputedValue.pl    |  61 ++-
 lib/Config/Model/models/Itself/ConfigAccept.pod    |  16 +-
 lib/Config/Model/models/Itself/ConfigRead.pod      |  12 +-
 .../Model/models/Itself/ConfigWR/DefaultLayer.pod  |   2 +-
 lib/Config/Model/models/Itself/ConfigWrite.pod     |  12 +-
 lib/Config/Model/models/Itself/Element.pl          |   2 +-
 lib/Config/Model/models/Itself/Element.pod         |  14 +-
 lib/Config/Model/models/Itself/MigratedValue.pl    | 101 ++---
 lib/Config/Model/models/Itself/Model.pl            |   2 +-
 .../Model/models/Itself/NonWarpableElement.pl      |   6 +-
 lib/Config/Model/models/Itself/WarpOnlyElement.pl  |   2 +-
 lib/Config/Model/models/Itself/WarpValue.pl        |   7 +-
 lib/Config/Model/models/Itself/WarpValue.pod       |   2 +-
 .../Model/models/Itself/WarpableCargoElement.pl    |   2 +-
 lib/Config/Model/models/Itself/WarpableElement.pl  |   6 +-
 t/cme-meta-plugin.t                                |   6 +-
 t/itself_snippet.t                                 |  66 ++--
 t/pod.t                                            |   3 +-
 45 files changed, 433 insertions(+), 731 deletions(-)

diff --git a/Build.PL b/Build.PL
index 3df3ecc..7eaafae 100644
--- a/Build.PL
+++ b/Build.PL
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
@@ -79,8 +79,8 @@ my $build = $class->new
     'App::Cme' => '1.002',
     'App::Cme::Common' => '0',
     'Carp' => '0',
-    'Config::Model' => '2.091',
-    'Config::Model::TkUI' => '1.210',
+    'Config::Model' => '2.098',
+    'Config::Model::TkUI' => '0',
     'Config::Model::Value' => '0',
     'Data::Compare' => '0',
     'Data::Dumper' => '0',
@@ -91,14 +91,13 @@ my $build = $class->new
     'Log::Log4perl' => '1.11',
     'Mouse' => '0',
     'Mouse::Util::TypeConstraints' => '0',
-    'Path::Tiny' => '0',
+    'Path::Tiny' => '0.062',
     'Pod::POM' => '0',
     'Tk' => '0',
     'YAML::Tiny' => '0',
     'perl' => '5.010'
   },
 
-   script_files  => [ 'config-model-edit' ],
    add_to_cleanup => [qw/wr_test/] ,
   );
 
diff --git a/Changes b/Changes
index 3b1b426..d252cd7 100644
--- a/Changes
+++ b/Changes
@@ -1,3 +1,26 @@
+2.007 2017-03-05
+
+  New features:
+    * add file_mode parameter to backend model
+    * Allow plugin injection in other class
+      (depends on Config::Model 2.098)
+    * add synopsis and link_to_doc parameter to the
+      model class that represent application
+
+  Build:
+    * update © years
+    * requires Path::Tiny >= 0.062
+
+  Bug fixes:
+    * cme meta: don't read plugin when loading model..
+    * remove obsolete config-model-edit command
+
+  Doc updates:
+    * show all commands in meta's description
+    * update compute value doc in model
+    * mention &index in backend file parameter
+    * update INI comment_delimiter doc
+
 2.006 2016-09-14
 
   Bug fix following removal of '.' from @INC
diff --git a/LICENSE b/LICENSE
index d355877..ce67306 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-This software is Copyright (c) 2007-2016 by Dominique Dumont.
+This software is Copyright (c) 2007-2017 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/MANIFEST b/MANIFEST
index 80583b3..5fdc328 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -1,4 +1,4 @@
-# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.007.
+# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.008.
 Build.PL
 CONTRIBUTING.md
 Changes
@@ -6,8 +6,8 @@ LICENSE
 MANIFEST
 META.json
 META.yml
+README-build-from-git.md
 README.md
-config-model-edit
 contrib/bash_completion.cme_meta
 data/application.d/master
 data/models/MasterModel.pl
diff --git a/META.json b/META.json
index a341ee9..fa399f3 100644
--- a/META.json
+++ b/META.json
@@ -4,13 +4,13 @@
       "Dominique Dumont"
    ],
    "dynamic_config" : 0,
-   "generated_by" : "Dist::Zilla version 6.007, CPAN::Meta::Converter version 2.150010",
+   "generated_by" : "Dist::Zilla version 6.008, CPAN::Meta::Converter version 2.150005",
    "license" : [
       "lgpl_2_1"
    ],
    "meta-spec" : {
       "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
-      "version" : 2
+      "version" : "2"
    },
    "name" : "Config-Model-Itself",
    "prereqs" : {
@@ -30,8 +30,8 @@
             "App::Cme" : "1.002",
             "App::Cme::Common" : "0",
             "Carp" : "0",
-            "Config::Model" : "2.091",
-            "Config::Model::TkUI" : "1.210",
+            "Config::Model" : "2.098",
+            "Config::Model::TkUI" : "0",
             "Config::Model::Value" : "0",
             "Data::Compare" : "0",
             "Data::Dumper" : "0",
@@ -42,7 +42,7 @@
             "Log::Log4perl" : "1.11",
             "Mouse" : "0",
             "Mouse::Util::TypeConstraints" : "0",
-            "Path::Tiny" : "0",
+            "Path::Tiny" : "0.062",
             "Pod::POM" : "0",
             "Tk" : "0",
             "YAML::Tiny" : "0",
@@ -75,7 +75,7 @@
          "web" : "http://github.com/dod38fr/config-model-itself"
       }
    },
-   "version" : "2.006",
-   "x_serialization_backend" : "Cpanel::JSON::XS version 3.0217"
+   "version" : "2.007",
+   "x_serialization_backend" : "JSON::XS version 3.03"
 }
 
diff --git a/META.yml b/META.yml
index 050124f..6b81f54 100644
--- a/META.yml
+++ b/META.yml
@@ -16,7 +16,7 @@ build_requires:
 configure_requires:
   Module::Build: '0.34'
 dynamic_config: 0
-generated_by: 'Dist::Zilla version 6.007, CPAN::Meta::Converter version 2.150010'
+generated_by: 'Dist::Zilla version 6.008, CPAN::Meta::Converter version 2.150005'
 license: lgpl
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
@@ -26,8 +26,8 @@ requires:
   App::Cme: '1.002'
   App::Cme::Common: '0'
   Carp: '0'
-  Config::Model: '2.091'
-  Config::Model::TkUI: '1.210'
+  Config::Model: '2.098'
+  Config::Model::TkUI: '0'
   Config::Model::Value: '0'
   Data::Compare: '0'
   Data::Dumper: '0'
@@ -38,7 +38,7 @@ requires:
   Log::Log4perl: '1.11'
   Mouse: '0'
   Mouse::Util::TypeConstraints: '0'
-  Path::Tiny: '0'
+  Path::Tiny: '0.062'
   Pod::POM: '0'
   Tk: '0'
   YAML::Tiny: '0'
@@ -47,5 +47,5 @@ resources:
   bugtracker: https://github.com/dod38fr/config-model-itself/issues
   homepage: https://github.com/dod38fr/config-model/wiki
   repository: git://github.com/dod38fr/config-model-itself.git
-version: '2.006'
-x_serialization_backend: 'YAML::Tiny version 1.69'
+version: '2.007'
+x_serialization_backend: 'YAML::Tiny version 1.70'
diff --git a/README-build-from-git.md b/README-build-from-git.md
new file mode 100644
index 0000000..7491425
--- /dev/null
+++ b/README-build-from-git.md
@@ -0,0 +1,56 @@
+# How to build Config::Model::Itself from git repository
+
+`Config::Model::Itself` is build with [Dist::Zilla](http://dzil.org/). This
+page details how to install the tools and dependencies required to
+build this module.
+
+## Install tools and dependencies
+
+### Debian, Ubuntu and derivatives
+
+Run
+
+    $ sudo apt install libdist-zilla-perl libdist-zilla-app-command-authordebs-perl
+    $ dzil authordebs --install
+    $ sudo apt build-dep libconfig-model-itself-perl
+
+The [libdist-zilla-app-command-authordebs-perl package](https://tracker.debian.org/pkg/libdist-zilla-app-command-authordebs-perl) is quite recent (uploaded on Dec 2016 in Debian/unstable) 
+and may not be available yet on your favorite distribution.
+
+### Other systems
+
+Run 
+
+    $ cpamn Dist::Zilla
+    $ dzil authordeps -missing | cpanm --notest
+    $ dzil listdeps --missing | cpanm --notest
+
+NB: The author would welcome pull requests that explains how to
+install these tools and dependencies using native package of other
+distributions.
+
+## Build Config::Model::Itself
+
+Run
+
+    dzil build 
+
+or 
+
+    dzil test
+
+`dzil` may complain about missing `EmailNotify` or `Twitter`
+plugin. You may ignore this or edit [dist.ini](dist.ini) to comment
+out the last 2 sections. These are useful only to the author when
+releasing a new version.
+
+
+`dzil` may also return an error like `Cannot determine local time
+zone`. In this case, you should specify explicitely your timezone in
+a `TZ` environement variable. E.g run `dzil` this way:
+
+    TZ="Europe/Paris" dzil test
+
+The list of possible timezones is provided by
+[DateTime::TimeZone::Catalog](https://metacpan.org/pod/DateTime::TimeZone::Catalog)
+documentation.
diff --git a/README.md b/README.md
index fe5be10..46687e9 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,5 @@
 
+[![](https://travis-ci.org/dod38fr/config-model-itself.svg?branch=master)](https://travis-ci.org/dod38fr/config-model-itself)
 
 ## What is Config::Model::Itself ##
 
@@ -62,8 +63,15 @@ For more details, see:
 
 On debian/ubuntu:
 
-    apt-get install libconfig-model-itself-perl
+    apt-get install cme libconfig-model-itself-perl libconfig-model-tkui-perl
 
 Otherwise:
 
     cpanm Config::Model::Itself
+    cpanm App::Cme
+    cpanm Config::Model::TkUI
+    
+## Build from git
+
+See [build from git instructions](README-build-from-git.md)
+
diff --git a/config-model-edit b/config-model-edit
deleted file mode 100644
index d298b2c..0000000
--- a/config-model-edit
+++ /dev/null
@@ -1,438 +0,0 @@
-#!/usr/bin/env perl
-#
-# This file is part of Config-Model-Itself
-#
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
-#
-# This is free software, licensed under:
-#
-#   The GNU Lesser General Public License, Version 2.1, February 1999
-#
-
-use strict ;
-use warnings ;
-use 5.10.1;
-
-use Config::Model;
-use Getopt::Long ;
-use Pod::Usage ;
-use Log::Log4perl ;
-use Config::Model::Itself ;
-use YAML::Tiny;
-
-use Tk ;
-use Config::Model::TkUI ;
-use Config::Model::Itself::TkEditUI ;
-use Path::Tiny ;
-use lib qw/lib/ ;
-
-my $log4perl_syst_conf_file = '/etc/log4config-model.conf' ;
-my $log4perl_user_conf_file = $ENV{HOME}.'/.log4config-model' ;
-my $fallback_conf = << 'EOC';
-log4perl.logger=WARN, Screen
-log4perl.appender.Screen        = Log::Log4perl::Appender::Screen
-log4perl.appender.Screen.stderr = 0
-log4perl.appender.Screen.layout = Log::Log4perl::Layout::PatternLayout
-log4perl.appender.Screen.layout.ConversionPattern = %d %m %n
-EOC
-
-my $log4perl_conf 
-  = -e $log4perl_user_conf_file ?  $log4perl_user_conf_file
-  : -e $log4perl_syst_conf_file ?  $log4perl_syst_conf_file
-  :                               \$fallback_conf ;
-
-Log::Log4perl::init($log4perl_conf);
-
-
-my $dev_cm_lib_dir = path(qw/lib Config Model/);
-my $root_model ;
-my $trace = 0 ;
-
-
-
-sub load_data {
-    my $load_file = shift ;
-
-    my @data ;
-    if ( $load_file eq '-' ) {
-	@data = <STDIN> ;
-    }
-    else {
-	open(LOAD,$load_file) || die "cannot open load file $load_file:$!";
-	@data = <LOAD> ;
-	close LOAD; 
-    }
-
-    return wantarray ? @data : join('', at data);
-}
-
-my $man = 0;
-my $help = 0;
-my $force_load = 0;
-my $model_dir_path ;
-my $do_dot = 0;
-my $do_dump;
-my $dumptype;
-my $do_yaml = 0;
-my $load_yaml ;
-my $save = 0;
-my $load ;
-# my $model_modified = 0;
-my $open_item = '';
-my $plugin_file = '';
-my $read_system;
-
-my $result = GetOptions (
-			 "dir=s"            => \$model_dir_path,
-			 "model=s"          => \$root_model,
-			 "man!"             => \$man,
-			 "help!"            => \$help,
-			 "force-load|force_load!"      => \$force_load,
-			 "save!"            => \$save,
-			 "dot-diagram|dot_diagram!"     => \$do_dot ,
-			 "dump:s"            => \$do_dump ,
-             "dumptype=s"       => \$dumptype,
-             "load=s"           => \$load,
-             "load-yaml|load_yaml=s"      => \$load_yaml,
-			 "dump-yaml|dump_yaml!"       => \$do_yaml ,
-			 "open-item|open_item=s"      => \$open_item ,
-			 "plugin-file=s"     => \$plugin_file ,
-             "system!" => \$read_system,
-			);
-
-pod2usage(2) if not $result ;
-pod2usage(1) if $help;
-pod2usage(-verbose => 2) if $man;
-
-Config::Model::Exception::Any->Trace(1) if $trace ;
-
-say 'This command is deprecated, please use "cme meta edit"';
-
-die "Unspecified root configuration model (option -model)\n"
-  unless defined $root_model ;
-
-my $model_dir = $model_dir_path ? path(split m!/!, $model_dir_path) : $dev_cm_lib_dir ;
-
-if (! $model_dir->is_dir) {
-    $model_dir->mkpath(0, 0755) || die "can't create $model_dir:$!";
-}
-
-my $meta_model = Config::Model -> new();
-
-my $meta_inst = $meta_model->instance(
-    root_class_name => 'Itself::Model',
-    instance_name   => $root_model . ' model',
-    check           => $force_load ? 'no' : 'yes',
-);
-
-my $meta_root = $meta_inst -> config_root ;
-
-my $system_model_dir = $INC{'Config/Model.pm'} ;
-$system_model_dir =~ s/\.pm//;
-
-my $meta_model_dir = ($read_system || $plugin_file)  ? $system_model_dir : $model_dir->canonpath ;
-
-say "Reading model from $meta_model_dir" if $read_system;
-
-# now load model
-my $rw_obj = Config::Model::Itself -> new(
-    model_object => $meta_root,
-    cm_lib_dir   => $meta_model_dir,
-) ;
-
-# my $root_model_file = $root_model ;
-# $root_model_file =~ s!::!/!g ;
-
-# if (not -e $read_model_dir.'/'.$root_model_file.'.pl') {
-    # $read_model_dir =  $INC{'Config/Model.pm'} ;
-    # $read_model_dir =~ s/\.pm//;
-    # $read_model_dir .= '/models' ;
-# }
-
-$meta_inst->initial_load_start ;
-$meta_inst->layered_start if $plugin_file;
-
-$rw_obj->read_all(
-    force_load => $force_load,
-    root_model => $root_model,
-    # legacy     => 'ignore',
-);
-
-if ($plugin_file) {
-    $meta_inst->layered_stop;
-
-    # load any existing plugin file
-    $rw_obj->read_model_snippet(snippet_dir => $model_dir, model_file => $plugin_file) ;
-}
-
-$meta_inst->initial_load_stop ;
-
-if (defined $load) {
-    my $data = load_data($load) ;
-    $data = qq(class:"$root_model" ).$data unless $data =~ /^\s*class:/ ;
-    $meta_root->load($data);
-}
-
-if (defined $load_yaml) {
-    my $yaml = load_data($load_yaml) ;
-    my $pdata = Load($yaml) ;
-    $meta_root->load_data($pdata) ;
-}
-
-if (@ARGV) {
-    my $data = join(' ', at ARGV) ;
-    $data = qq(class:"$root_model" ).$data unless $data =~ /^\s*class:/ ;
-    $meta_root->load($data) ;
-}
-
-if ($do_dot) {
-    print $rw_obj->get_dot_diagram ;
-    exit ;
-}
-
-if (defined $do_dump) {
-    my $dump_string = $meta_root->dump_tree( mode => $dumptype || 'custom' ) ;
-    if ($do_dump) {
-	open(DUMP,">$do_dump") or die "cannot dump in $do_dump:$!";
-	print DUMP $dump_string ;
-	close DUMP;
-    }
-    else {
-	print $dump_string ;
-    }
-    exit ;
-}
-
-if ($do_yaml) {
-    require YAML::Tiny;
-    import YAML::Tiny qw/Dump/;
-    print Dump($meta_root->dump_as_data(ordered_hash_as_list => 0)) ;
-    exit ;
-}
-
-my $write_sub = $plugin_file ? 
-    sub { 
-	$rw_obj->write_model_snippet(snippet_dir => $model_dir, model_file => $plugin_file );
-    }
-    : sub { 
-	my $wr_dir = shift || $model_dir ;
-	$rw_obj->write_all( );
-    } ;
-
-if ($save) {
-    &$write_sub ;
-    exit ;
-}
-
-my $mw = MainWindow-> new;
-
-$mw->withdraw ;
-# Thanks to Jerome Quelin for the tip
-$mw->optionAdd('*BorderWidth' => 1);
-
-my $cmu = $mw->ConfigModelEditUI(
-    -root       => $meta_root,
-    -store_sub  => $write_sub,
-    -model_name => $root_model,
-);
-
-if (not $meta_root->fetch_element('class')->fetch_size) {
-    $open_item ||=  qq(class:"$root_model" );
-}
-else {
-    $open_item ||= 'class';
-}
-
-if ($open_item) {
-    my $obj = $meta_root->grab($open_item) ;
-    $cmu->after(10, sub { $cmu->force_element_display($obj) });
-}
-
-&MainLoop ; # Tk's
-
-
-
-__END__
-
-=pod
-
-=head1 NAME
-
-config-model-edit - Deprecated use cme meta edit
-
-=head1 SYNOPSIS
-
-  config-model-edit [options] -model Sshd [ class:Sshd element:Foo ... ]
-
-  # plugin mode
-  config-model-edit [options] -model Debian::Dpkg -plugin-file dpkg-snippet.pl
-
-=head1 DESCRIPTION
-
-config-model-edit will provides a Perl/Tk graphical interface to edit
-configuration models that will be used by Config::Model.
-
-Config::Model is a general purpose configuration framework based on
-configuration models (See L<Config::Model> for details).
-
-This configuration model is also expressed as structured data. This
-structure data is structured and follow a set of rules which are
-described for humans in L<Config::Model>.
-
-The structure and rules documented in L<Config::Model> are also expressed
-in a model in the files provided with L<Config::Model::Itself>.
-
-Hence the possibity to verify, modify configuration data provided by
-Config::Model can also be applied on configuration models using the
-same user interface as L<config-edit>.
-
-The model editor program is config-model-edit.
-
-=head1 USAGE
-
-C<config-model-edit> will read and write model file from
-C<./lib/Config/Model/models>. 
-
-When you specify a C<-model> options, only configuration models matching
-this options will be loaded. I.e.
-
-  config-model-edit -model Xorg
-
-will load models C<Xorg> (file C<Xorg.pl>) and all other C<Xorg::*> like
-C<Xorg::Screen> (file C<Xorg/Screen.pl>).
-
-=head1 Options
-
-=over
-
-=item -model
-
-Mandatory option that specifies the configuration model to be
-edited.
-
-=item -plugin-file foo.pl
-
-this option can be used to create model plugins. A model plugin is an addendum to 
-an existing model. The resulting file will be saved in a C<.d> directory besides the 
-original file to be taken into account. 
-
-For instance:
-
- $ config-model-edit -model Debian::Dpkg -plugin-file my-plugin.pl 
- # perform additions to Debian::Dpkg and Debian::Dpkg::Control::Source and save
- $ find lib -name my-plugin.pl
- lib/Config/Model/models/Debian/Dpkg.d/my-plugin.pl
- lib/Config/Model/models/Debian/Dpkg/Control/Source.d/my-plugin.pl
-
-=item system
-
-Read model from system files, i.e. from installed files, not from
-C<./lib> directory.
-
-=item -trace
-
-Provides a full stack trace when exiting on error.
-
-=item -force-load
-
-Load file even if error are found in data. Bad data are loaded, but should be cleaned up 
-before saving the model. See menu C<< File -> check >> in the GUI.
-
-=item -dot-diagram
-
-Returns a dot file that represent the structure of the configuration
-model. C<include> are represented by solid lines. Class usage
-(i.e. C<config_class_name> parameter) is represented by dashed
-lines. The name of the element is attached to the dashed line.
-
-=item -dump [ file ]
-
-Dump configuration content on STDOUT or in the specified with
-Config::Model syntax.
-
-By default, dump only custom values, i.e. different from application
-built-in values or model default values. See -dumptype option for
-other types of dump
-
-=item -dumptype [ full | preset | custom ]
-
-Choose to dump every values (full), only preset values or only
-customized values (default)
-
-=item -load <cds_file_to_load> | -
-
-Load model from cds file (using Config::Model serialisation format,
-typically done with -dump option). This option can be used with
-C<-save> to directly save a model loaded from the cds file or from
-STDIN.
-
-=item -load-yaml <yaml_file_to_load> | -
-
-Load configuration data in model from YAML file. This
-option can be used with C<-save> to directly save a model loaded from
-the YAML file or from STDIN.
-
-=item -dump_yaml 
-
-Dump a model in YAML format
-
-=item -save
-
-Force a save of the model even if no edition was done. This option is
-useful to migrate a model when Config::Model model feature changes.
-
-=item -dir
-
-Directory where to read and write model
-
-=item -open-item 'path'
-
-In graphical mode, force the UI to open the node specified. E.g.
-
- -open_item 'class:Fstab::FsLine element:fs_mntopts rules'
-
-=back
-
-=head1 LOGGING
-
-All Config::Model logging was moved from klunky debug and
-verbose prints to L<Log::Log4perl>. Logging can be configured in the
-following files:
-
-=over
-
-=item *
-
- ~/.log4config-model
-
-=item * 
-
- /etc/log4config-model.conf
-
-=back
-
-Without these files, the following Log4perl config is used:
-
- log4perl.logger=WARN, Screen
- log4perl.appender.Screen        = Log::Log4perl::Appender::Screen
- log4perl.appender.Screen.stderr = 0
- log4perl.appender.Screen.layout = Log::Log4perl::Layout::PatternLayout
- log4perl.appender.Screen.layout.ConversionPattern = %d %m %n
-
-Log4Perl categories are shown in L<config-edit/LOGGING>
-
-=head1 AUTHOR
-
-Dominique Dumont, ddumont at cpan dot org
-
-=head1 SEE ALSO
-
-L<Config::Model>, 
-L<Config::Model::Node>, 
-L<Config::Model::Instance>, 
-L<Config::Model::HashId>,
-L<Config::Model::ListId>,
-L<Config::Model::WarpedNode>,
-L<Config::Model::Value>
-
-=cut
diff --git a/data/models/MasterModel.pl b/data/models/MasterModel.pl
index ba3017b..617acf0 100644
--- a/data/models/MasterModel.pl
+++ b/data/models/MasterModel.pl
@@ -2,7 +2,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/data/models/MasterModel/CheckListExamples.pl b/data/models/MasterModel/CheckListExamples.pl
index 073ff6f..16e75cf 100644
--- a/data/models/MasterModel/CheckListExamples.pl
+++ b/data/models/MasterModel/CheckListExamples.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/data/models/MasterModel/HashIdOfValues.pl b/data/models/MasterModel/HashIdOfValues.pl
index 14a72a1..d01213b 100644
--- a/data/models/MasterModel/HashIdOfValues.pl
+++ b/data/models/MasterModel/HashIdOfValues.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/data/models/MasterModel/References.pl b/data/models/MasterModel/References.pl
index 2c3a377..3694084 100644
--- a/data/models/MasterModel/References.pl
+++ b/data/models/MasterModel/References.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/data/models/MasterModel/WarpedId.pl b/data/models/MasterModel/WarpedId.pl
index c0dc488..e30af09 100644
--- a/data/models/MasterModel/WarpedId.pl
+++ b/data/models/MasterModel/WarpedId.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/data/models/MasterModel/WarpedValues.pl b/data/models/MasterModel/WarpedValues.pl
index 376a255..71865c9 100644
--- a/data/models/MasterModel/WarpedValues.pl
+++ b/data/models/MasterModel/WarpedValues.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/data/models/MasterModel/X_base_class.pl b/data/models/MasterModel/X_base_class.pl
index c4caa92..e9e8224 100644
--- a/data/models/MasterModel/X_base_class.pl
+++ b/data/models/MasterModel/X_base_class.pl
@@ -2,7 +2,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/lib/App/Cme/Command/meta.pm b/lib/App/Cme/Command/meta.pm
index e80680c..c2950b6 100644
--- a/lib/App/Cme/Command/meta.pm
+++ b/lib/App/Cme/Command/meta.pm
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
@@ -10,7 +10,7 @@
 # ABSTRACT: Edit the configuration of an application
 
 package App::Cme::Command::meta ;
-$App::Cme::Command::meta::VERSION = '2.006';
+$App::Cme::Command::meta::VERSION = '2.007';
 use strict ;
 use warnings ;
 use 5.10.1;
@@ -94,7 +94,7 @@ sub opt_spec {
 sub usage_desc {
   my ($self) = @_;
   my $desc = $self->SUPER::usage_desc; # "%c COMMAND %o"
-  return "$desc [ edit | gendot | dump | yaml ] your_model_class ";
+  return "$desc [ ".join(' | ', sort keys %meta_cmd)." ] your_model_class ";
 }
 
 sub description {
@@ -157,7 +157,7 @@ sub load_meta_model {
     my $system_cm_lib_dir = $INC{'Config/Model.pm'} ;
     $system_cm_lib_dir =~ s/\.pm//;
 
-    return ($meta_inst, $meta_root, $cm_lib_dir, $system_cm_lib_dir);
+    return ($meta_inst, $meta_root, $cm_lib_dir, path($system_cm_lib_dir));
 }
 
 sub load_meta_root {
@@ -206,14 +206,21 @@ sub load_meta_plugin {
     my ($meta_inst, $meta_root, $cm_lib_dir, $system_cm_lib_dir) = $self->load_meta_model($opt, $args);
 
     my $root_model = $opt->{_root_model};
-    my $meta_cm_lib_dir = $system_cm_lib_dir ;
-    my $plugin_file = shift @$args or die "missing plugin file name after application name.";
+    my $meta_cm_lib_dir = $opt->dev ? $cm_lib_dir : $system_cm_lib_dir ;
+    my $plugin_name = shift @$args or die "missing plugin file name after application name.";
+
+    if ($plugin_name =~ s/\.pl$//) {
+        warn "removed '.pl' deprecated suffix from plugin name\n";
+    }
+
+    say "Preparing plugin $plugin_name for model $root_model found in $meta_cm_lib_dir";
+    say "Use -dev option to create a plugin for a local model (i.e. in $cm_lib_dir)"
+        unless $opt->dev;
 
-    say "Preparing plugin for model $root_model";
     # now load model
     my $rw_obj = Config::Model::Itself -> new(
         model_object => $meta_root,
-        cm_lib_dir   => $meta_cm_lib_dir,
+        cm_lib_dir   => $meta_cm_lib_dir->canonpath,
     ) ;
 
     $meta_inst->initial_load_start ;
@@ -228,16 +235,20 @@ sub load_meta_plugin {
     $meta_inst->layered_stop;
 
     # load any existing plugin file
-    $rw_obj->read_model_snippet(snippet_dir => $cm_lib_dir, model_file => $plugin_file) ;
+    $rw_obj->read_model_plugin(
+        plugin_dir => $cm_lib_dir.'/models/',
+        plugin_name => $plugin_name
+    ) ;
 
     $meta_inst->initial_load_stop ;
 
     $self->load_optional_data($args, $opt, $root_model, $meta_root) ;
-
+    my $root_model_dir = $root_model ;
+    $root_model_dir =~ s!::!/!g;
     my $write_sub = sub {
-            $rw_obj->write_model_snippet(
-                snippet_dir => $cm_lib_dir,
-                model_file => $plugin_file
+            $rw_obj->write_model_plugin(
+                plugin_dir => "$cm_lib_dir/models/$root_model_dir.d",
+                plugin_name => $plugin_name
             );
         } ;
 
@@ -394,7 +405,7 @@ App::Cme::Command::meta - Edit the configuration of an application
 
 =head1 VERSION
 
-version 2.006
+version 2.007
 
 =head1 SYNOPSIS
 
@@ -405,7 +416,7 @@ version 2.006
   cme meta [ options ] check [ model_class ]
 
   # model plugin mode
-  cme meta [options] plugin Debian::Dpkg dpkg-snippet.pl
+  cme meta [options] plugin application plugin_name
 
 =head1 DESCRIPTION
 
@@ -442,16 +453,19 @@ C<./lib/Config/Model/models> directory and checks their validity.
 =head2 plugin
 
 This sub command is used to create model plugins. A model plugin is an
-addendum to an existing model. The resulting file will be saved in a
+addendum to an existing model. The resulting file is saved in a
 C<.d> directory besides the original file to be taken into account.
 
 For instance:
 
- $ cme meta plugin Debian::Dpkg my-plugin.pl
- # perform additions to Debian::Dpkg and Debian::Dpkg::Control::Source and save
- $ find lib -name my-plugin.pl
- lib/Config/Model/models/Debian/Dpkg.d/my-plugin.pl
- lib/Config/Model/models/Debian/Dpkg/Control/Source.d/my-plugin.pl
+ $ cme meta plugin dpkg my-plugin
+ # perform additions to Dpkg and Dpkg::Control and save
+ $ find lib/Config/Model/models/Dpkg.d -type f
+ lib/Config/Model/models/Debian/Dpkg.d/my-plugin/Dpkg.pl
+ lib/Config/Model/models/Debian/Dpkg.d/my-plugin/Dpkg/Control.pl
+
+Use C<-dev> option if you need to add plugins to a model located in
+current directory.
 
 =head2 gen-dot [ file.dot ]
 
@@ -567,10 +581,10 @@ model. (which explains the "Itself" name. This module could also be
 named C<Config::Model::DogFooding>).
 
 This explains why the GUI shown by C<cme meta edit> looks like the GUI
-shown by C<cme edit>: the same GUI generator is used>.
+shown by C<cme edit>: the same GUI generator is used.
 
 If you're new to L<Config::Model>, I'd advise not to peek under
-C<Config::Model::Itself> hood lest you'll loose your sanity.
+C<Config::Model::Itself> hood lest you loose your sanity.
 
 =head1 AUTHOR
 
@@ -628,7 +642,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2007-2016 by Dominique Dumont.
+This software is Copyright (c) 2007-2017 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Itself.pm b/lib/Config/Model/Itself.pm
index 9acd79c..32fc40e 100644
--- a/lib/Config/Model/Itself.pm
+++ b/lib/Config/Model/Itself.pm
@@ -1,16 +1,16 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Itself ;
-$Config::Model::Itself::VERSION = '2.006';
+$Config::Model::Itself::VERSION = '2.007';
 use Mouse ;
-use Config::Model 2.091;
+use Config::Model 2.098;
 use 5.010;
 
 use IO::File ;
@@ -21,7 +21,7 @@ use File::Find ;
 use File::Path ;
 use File::Basename ;
 use Data::Compare ;
-use Path::Tiny;
+use Path::Tiny 0.062;
 use Mouse::Util::TypeConstraints;
 
 my $logger = Log::Log4perl::get_logger("Backend::Itself");
@@ -259,7 +259,8 @@ sub read_all {
     my @files ;
     my $wanted = sub {
         push @files, $_ if ( $_->is_file and /\.pl$/
-                            and m!$read_dir/$root_model_file\b!
+                                 and m!$read_dir/$root_model_file\b!
+                                 and not m!\.d/!
                            ) ;
     } ;
     $read_dir->visit($wanted, { recurse => 1} ) ;
@@ -498,14 +499,14 @@ sub write_all {
     $self->meta_instance->clear_changes ;
 }
 
-sub write_model_snippet {
+sub write_model_plugin {
     my $self = shift ;
     my %args = @_ ;
-    my $snippet_dir = delete $args{snippet_dir}
-      || croak __PACKAGE__," write_model_snippet: undefined snippet_dir";
-    my $model_file = delete $args{model_file}
-      || croak __PACKAGE__," write_model_snippet: undefined model_file";
-    croak "write_model_snippet: unexpected parameters ",join(' ', keys %args) if %args ;
+    my $plugin_dir = delete $args{plugin_dir}
+      || croak __PACKAGE__," write_model_plugin: undefined plugin_dir";
+    my $plugin_name = delete $args{plugin_name}
+        || croak __PACKAGE__," write_model_plugin: undefined plugin_name";
+    croak "write_model_plugin: unexpected parameters ",join(' ', keys %args) if %args ;
 
     my $model = $self->meta_root->dump_as_data ;
     # print (Dumper( $model)) ;
@@ -517,23 +518,23 @@ sub write_model_snippet {
 
         # does not distinguish between notes from underlying model or snipper notes ...
         my @notes = $self->meta_root->grab("class:$class")->dump_annotations_as_pod ;
-        my $class_dir = $class.'.d';
-        $class_dir =~ s!::!/!g;
-        write_model_file ("$snippet_dir/$class_dir/$model_file", [], \@notes, [ $data ]);
+        my $plugin_file = $class.'.pl';
+        $plugin_file =~ s!::!/!g;
+        write_model_file ("$plugin_dir/$plugin_name/$plugin_file", [], \@notes, [ $data ]);
     }
 
     $self->meta_instance->clear_changes ;
 }
 
-sub read_model_snippet {
+sub read_model_plugin {
     my $self = shift ;
     my %args = @_ ;
-    my $snippet_dir = delete $args{snippet_dir}
-      || croak __PACKAGE__," write_model_snippet: undefined snippet_dir";
-    my $model_file = delete $args{model_file}
-      || croak __PACKAGE__," read_model_snippet: undefined model_file";
+    my $plugin_dir = delete $args{plugin_dir}
+      || croak __PACKAGE__," write_model_plugin: undefined plugin_dir";
+    my $plugin_name = delete $args{plugin_name}
+      || croak __PACKAGE__," read_model_plugin: undefined plugin_name";
 
-    croak "read_model_snippet: unexpected parameters ",join(' ', keys %args) if %args ;
+    croak "read_model_plugin: unexpected parameters ",join(' ', keys %args) if %args ;
 
     my @files ;
     my $wanted = sub {
@@ -541,35 +542,35 @@ sub read_model_snippet {
         push @files, $n if (-f $_ and not /~$/
                             and $n !~ /CVS/
                             and $n !~ m!.(svn|orig|pod)$!
-                            and $n =~ m!\.d/$model_file!
+                            and $n =~ m!\.d/$plugin_name!
                            ) ;
     } ;
-    find ($wanted, $snippet_dir ) ;
+    find ($wanted, $plugin_dir ) ;
 
     my $class_element = $self->meta_root->fetch_element('class') ;
 
     foreach my $load_file (@files) {
-        $logger->info("trying to read snippet $load_file");
+        $logger->info("trying to read plugin $load_file");
 
         $load_file = "./$load_file" if $load_file !~ m!^/! and -e $load_file;
 
-        my $snippet = do $load_file ;
+        my $plugin = do $load_file ;
 
-        unless ($snippet) {
+        unless ($plugin) {
             if ($@) {die "couldn't parse $load_file: $@"; }
-            elsif (not defined $snippet) {die  "couldn't do $load_file: $!"}
+            elsif (not defined $plugin) {die  "couldn't do $load_file: $!"}
             else { die  "couldn't run $load_file" ;}
         }
 
-        # there should be only only class in each snippet file
-        foreach my $model (@$snippet) {
+        # there should be only only class in each plugin file
+        foreach my $model (@$plugin) {
             my $class_name = delete $model->{name} ;
             # load with a array ref to avoid warnings about missing order
             $class_element->fetch_with_id($class_name)->load_data( $model ) ;
         }
 
         # load annotations
-        $logger->info("loading annotations from snippet file $load_file");
+        $logger->info("loading annotations from plugin file $load_file");
         my $fh = IO::File->new($load_file) || die "Can't open $load_file: $!" ;
         my @lines = $fh->getlines ;
         $fh->close;
@@ -762,7 +763,7 @@ Config::Model::Itself - Model editor for Config::Model
 
 =head1 VERSION
 
-version 2.006
+version 2.007
 
 =head1 SYNOPSIS
 
@@ -793,12 +794,12 @@ Config::Itself module and its model files provide a model of Config:Model
 (hence the Itself name).
 
 Let's step back a little to explain. Any configuration data is, in
-essence, structured data. This data could be stored in an XML file. A
+essence, structured data. A
 configuration model is a way to describe the structure and relation of
 all items of a configuration data set.
 
 This configuration model is also expressed as structured data. This
-structure data is structured and follow a set of rules which are
+structure data follows a set of rules which are
 described for humans in L<Config::Model>.
 
 The structure and rules documented in L<Config::Model> are also
@@ -806,7 +807,7 @@ expressed in a model in the files provided with
 C<Config::Model::Itself>.
 
 Hence the possibity to verify, modify configuration data provided by
-Config::Model can also be applied on configuration models. Using the
+L<Config::Model> can also be applied on configuration models. Using the
 same user interface.
 
 From a Perl point of view, Config::Model::Itself provides a class
@@ -844,16 +845,17 @@ C<read_all> returns a hash ref containing ( class_name => file_name , ...)
 Will write back configuration model in the specified directory. The
 structure of the read directory is respected.
 
-=head2 write_model_snippet( snippet_dir => foo, model_file => bar.pl )
+=head2 write_model_plugin( plugin_dir => foo, plugin_name => bar )
 
-Write snippet models in separate C<.d> directory. E.g. a snippet for class
-C<Foo::Bar> will be written in C<Foo/Bar.d/bar.pl> file. This file is to be used
+Write plugin models in the  passed C<plugin_dir> directory. The written file is path is
+made of plugin name and class names. E.g. a plugin named C<bar> for class
+C<Foo::Bar> is written in C<bar/Foo/Bar.pl> file. This file is to be used
 by L<augment_config_class|Config::Model/"augment_config_class (name => '...', class_data )">
 
-=head2 read_model_snippet( snippet_dir => foo, model_file => bar.pl )
+=head2 read_model_plugin( plugin_dir => foo, plugin_name => bar.pl )
 
-To read model snippets, this methid will search recursively C<$snippet_dir> and load
-all C<bar.pl> files found in there.
+This method searched recursively C<$plugin_dir/$plugin_name> and load
+all C<*.pl> files found there.
 
 =head2 list_class_element
 
@@ -895,7 +897,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2007-2016 by Dominique Dumont.
+This software is Copyright (c) 2007-2017 by Dominique Dumont.
 
 This is free software, licensed under:
 
@@ -942,7 +944,7 @@ CPANTS
 
 The CPANTS is a website that analyzes the Kwalitee ( code metrics ) of a distribution.
 
-L<http://cpants.perl.org/dist/overview/Config-Model-Itself>
+L<http://cpants.cpanauthors.org/dist/Config-Model-Itself>
 
 =item *
 
diff --git a/lib/Config/Model/Itself/BackendDetector.pm b/lib/Config/Model/Itself/BackendDetector.pm
index e9ee18a..57db72a 100644
--- a/lib/Config/Model/Itself/BackendDetector.pm
+++ b/lib/Config/Model/Itself/BackendDetector.pm
@@ -1,14 +1,14 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 package Config::Model::Itself::BackendDetector ;
-$Config::Model::Itself::BackendDetector::VERSION = '2.006';
+$Config::Model::Itself::BackendDetector::VERSION = '2.007';
 # since this package is mostly targeted for dev environments
 # let the detector detect models under development
 use lib 'lib';
@@ -102,7 +102,7 @@ Config::Model::Itself::BackendDetector - Detect available read/write backends us
 
 =head1 VERSION
 
-version 2.006
+version 2.007
 
 =head1 SYNOPSIS
 
@@ -159,7 +159,7 @@ Dominique Dumont
 
 =head1 COPYRIGHT AND LICENSE
 
-This software is Copyright (c) 2007-2016 by Dominique Dumont.
+This software is Copyright (c) 2007-2017 by Dominique Dumont.
 
 This is free software, licensed under:
 
diff --git a/lib/Config/Model/Itself/TkEditUI.pm b/lib/Config/Model/Itself/TkEditUI.pm
index 20fefbd..69b4d01 100644
--- a/lib/Config/Model/Itself/TkEditUI.pm
+++ b/lib/Config/Model/Itself/TkEditUI.pm
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
@@ -26,7 +26,7 @@
 #    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 
 package Config::Model::Itself::TkEditUI ;
-$Config::Model::Itself::TkEditUI::VERSION = '2.006';
+$Config::Model::Itself::TkEditUI::VERSION = '2.007';
 use strict;
 use warnings ;
 use Carp ;
diff --git a/lib/Config/Model/models/Itself/Application.pl b/lib/Config/Model/models/Itself/Application.pl
index 81d6269..1a10ae8 100644
--- a/lib/Config/Model/models/Itself/Application.pl
+++ b/lib/Config/Model/models/Itself/Application.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
@@ -20,6 +20,16 @@
                 value_type => 'reference',
                 description => 'Top class required to configure this application',
             },
+            synopsis => {
+                type => 'leaf',
+                value_type => 'uniline',
+                description => "one line description of the application."
+            },
+            link_to_doc => {
+                type => 'leaf',
+                value_type => 'uniline',
+                description => "Documentation URL."
+            },
             category => {
                 choice => [
                     'system',
diff --git a/lib/Config/Model/models/Itself/CargoElement.pl b/lib/Config/Model/models/Itself/CargoElement.pl
index a6b29ae..54a6d1a 100644
--- a/lib/Config/Model/models/Itself/CargoElement.pl
+++ b/lib/Config/Model/models/Itself/CargoElement.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/lib/Config/Model/models/Itself/Class.pl b/lib/Config/Model/models/Itself/Class.pl
index a56fea3..6cc1e77 100644
--- a/lib/Config/Model/models/Itself/Class.pl
+++ b/lib/Config/Model/models/Itself/Class.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
@@ -131,17 +131,17 @@
             include_after => "insert the included elements after a specific element. "
             . "By default, included elements are placed before all other elements.",
             include_backend => "Include the read/write specification of another class into this class.",
-            class_description => "Explain the purpose of this configuration class. This description will be re-used to generate the documentation of your configuration class. You can use pod markup to format your description. See L<perlpod> for details.",
-            read_config => "Specify the Perl class(es) and function(s) used to read configuration data. The specified function will be tried in sequence to get configuration data. ",
+            class_description => "Explain the purpose of this configuration class. This description is re-used to generate the documentation of your configuration class. You can use pod markup to format your description. See L<perlpod> for details.",
+            read_config => "Specify the Perl class(es) and function(s) used to read configuration data. The specified functions are tried in sequence to get configuration data. ",
             write_config => "Specify the Perl class and function used to write configuration data.",
             generated_by => "When set, this class was generated by some program. You should not edit "
                 ."this class as your modifications may be clobbered later on when the class is regenerated.",
-            accept => "Specifies names of the elements this configuration class will accept as valid. "
-                ."The key of the hash is a regular expression that will be tested against 
-           candidate parameters. When the parameter matches the regular expression, 
+            accept => "Specifies names of the elements this configuration class accepts as valid. "
+                ."The key of the hash is a regular expression that are be tested against
+           candidate parameters. When the parameter matches the regular expression,
            a new parameter is created in the model using the description provided
            in the value of this hash key. Note that the regexp must match the whole name
-           of the potential parameter. I.e. the specified regexp will be eval\'ed 
+           of the potential parameter. I.e. the specified regexp is eval\'ed
            with a leading C<^> and a trailing C<\$>."
         ],
     ],
@@ -176,7 +176,10 @@
                 description => 'specify the configuration file name. This parameter may '
                     .'not be applicable depending on your application. It may also be '
                     .'hardcoded in a custom backend. If not specified, the instance name '
-                    .'will be used as base name for your configuration file.',
+                    .'is used as base name for your configuration file. The configuration file name'
+                    .'can be specified with &index keyword when a backend is associated to a node '
+                    .'contained in a hash. See '
+                    .'L<backend specifications|http://search.cpan.org/dist/Config-Model/lib/Config/Model/BackendMgr.pm#Backend_specification>.'
             },
         ]
     ],
@@ -223,6 +226,14 @@
                }
             },
 
+            file_mode => {
+                type       => 'leaf',
+                value_type => 'uniline',
+                level      => 'normal',
+                summary     => 'configuration file mode',
+                description => 'specify the configuration file mode. C<file_mode> parameter can be used to set the '
+                    . 'mode of the written file. C<file_mode> value can be in any form suppported by L<Path::Tiny/chmod>.'
+            },
 
             default_layer => {
                 type => 'node',
@@ -253,7 +264,7 @@
                 type       => 'leaf',
                 value_type => 'uniline',
                 level      => 'hidden',
-                description => 'Specify element hash name that will contain all INI classes. '
+                description => 'Specify element hash name that contains all INI classes. '
                     .'See L<Config::Model::Backend::IniFile/"Arbitrary class name">',
                 warp => {
                     follow => '- backend',
@@ -265,13 +276,13 @@
                 type       => 'hash',
                 level      => 'hidden',
                 index_type => 'string',
-                description => 'Specify element name that will contain one INI class. E.g. to store '
+                description => 'Specify element name that contains one INI class. E.g. to store '
                      .'INI class [foo] in element Foo, specify { foo => "Foo" } ',
                 warp => {
                     follow => '- backend',
                     rules  => [ IniFile => { level => 'normal', } ],
                 },
-                cargo => { 
+                cargo => {
                     type => 'leaf',
                     value_type => 'uniline',
                 },
@@ -303,7 +314,7 @@
                 description => 'Specify how to write a boolean value in config file. Suggested values are '
                     . '"no","yes". ',
                 max_index => 1,
-                cargo => { 
+                cargo => {
                     type => 'leaf',
                     value_type => 'uniline',
                 },
@@ -359,7 +370,10 @@
                 type             => 'leaf',
                 value_type       => 'uniline',
                 level            => 'hidden',
-                description      => 'comment starts with this character',
+                description      => 'list of characters that start a comment. When more that one character'
+                .' is used. the first one is used to write back comment. For instance,'
+                .' value "#;" indicate that a comments can start with "#" or ";" and that all comments'
+                .' are written back with "#".',
                 upstream_default => '#',
                 warp             => {
                     follow => '- backend',
@@ -477,8 +491,8 @@
                 type => 'leaf',
                 value_type => 'reference' ,
                 refer_to => '- - element' ,
-                description => 'specify where to insert accepted element. This will'
-                 . ' not change the behavior but will help generating more consistent '
+                description => 'specify where to insert accepted element. This does'
+                 . ' not change the behavior and helps generating more consistent '
                  . ' user interfaces'
              }
 
diff --git a/lib/Config/Model/models/Itself/Class.pod b/lib/Config/Model/models/Itself/Class.pod
index fb4b86f..bc25ad9 100644
--- a/lib/Config/Model/models/Itself/Class.pod
+++ b/lib/Config/Model/models/Itself/Class.pod
@@ -16,7 +16,7 @@ Configuration class. This class represents a node of a configuration tree.
 
 =head2 class_description
 
-Explain the purpose of this configuration class. This description will be re-used to generate the documentation of your configuration class. You can use pod markup to format your description. See L<perlpod> for details. I<< Optional. Type string.  >> 
+Explain the purpose of this configuration class. This description is re-used to generate the documentation of your configuration class. You can use pod markup to format your description. See L<perlpod> for details. I<< Optional. Type string.  >> 
 
 =head2 license
 
@@ -56,7 +56,7 @@ When set, this class was generated by some program. You should not edit this cla
 
 =head2 read_config
 
-Specify the Perl class(es) and function(s) used to read configuration data. The specified function will be tried in sequence to get configuration data. I<< Optional. Type list of node of class L<Itself::ConfigRead|Config::Model::models::Itself::ConfigRead> .  >> 
+Specify the Perl class(es) and function(s) used to read configuration data. The specified functions are tried in sequence to get configuration data. I<< Optional. Type list of node of class L<Itself::ConfigRead|Config::Model::models::Itself::ConfigRead> .  >> 
 
 =head2 write_config
 
@@ -64,11 +64,11 @@ Specify the Perl class and function used to write configuration data. I<< Option
 
 =head2 accept
 
-Specifies names of the elements this configuration class will accept as valid. The key of the hash is a regular expression that will be tested against 
-           candidate parameters. When the parameter matches the regular expression, 
+Specifies names of the elements this configuration class accepts as valid. The key of the hash is a regular expression that are be tested against
+           candidate parameters. When the parameter matches the regular expression,
            a new parameter is created in the model using the description provided
            in the value of this hash key. Note that the regexp must match the whole name
-           of the potential parameter. I.e. the specified regexp will be eval'ed 
+           of the potential parameter. I.e. the specified regexp is eval'ed
            with a leading C<^> and a trailing C<$>. I<< Optional. Type hash of node of class L<Itself::ConfigAccept|Config::Model::models::Itself::ConfigAccept> .  >> 
 
 =head1 SEE ALSO
diff --git a/lib/Config/Model/models/Itself/CommonElement.pl b/lib/Config/Model/models/Itself/CommonElement.pl
index ca9190e..faf4fa7 100644
--- a/lib/Config/Model/models/Itself/CommonElement.pl
+++ b/lib/Config/Model/models/Itself/CommonElement.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
@@ -73,13 +73,13 @@ my %assert_payload = (
                 type       => 'leaf',
                 value_type => 'string',
                 description =>
-'Warning message to show user. "$_" will contain the bad value. Example "value $_ is bad". Leave blank or undef to use generated message',
+'Warning message to show user. "$_" contains the bad value. Example "value $_ is bad". Leave blank or undef to use generated message',
             },
             fix => {
                 type       => 'leaf',
                 value_type => 'string',
                 description =>
-'Perl instructions to fix the value. These instructions may be triggered by user. $_ will contain the value to fix.  $_ will be stored as the new value once the instructions are done. C<$self> will contain the value object. Use with care.',
+'Perl instructions to fix the value. These instructions may be triggered by user. $_ contains the value to fix.  $_ is stored as the new value once the instructions are done. C<$self> contains the value object. Use with care.',
             },
         ],
     ],
@@ -92,7 +92,7 @@ my %assert_payload = (
                 type       => 'leaf',
                 value_type => 'string',
                 description =>
-'Perl instructions to test the value. $_ will contain the value to test. C<$self> will contain the value object. Use with care.',
+'Perl instructions to test the value. $_ contains the value to test. C<$self> contains the value object. Use with care.',
             },
         ],
     ],
@@ -241,9 +241,9 @@ my %assert_payload = (
             'default' => {
                 type       => 'leaf',
                 level      => 'hidden',
-                value_type => 'uniline',
-                description =>
-'Specify default value. This default value will be written in the configuration data',
+                value_type => 'string',
+                description => 'Specify default value. This default value is written '
+                    .'in the configuration data',
                 warp => {
                     follow  => { 't'            => '?type' },
                     'rules' => [ '$t eq "leaf"' => { level => 'normal', } ]
@@ -253,7 +253,7 @@ my %assert_payload = (
             'upstream_default' => {
                 type       => 'leaf',
                 level      => 'hidden',
-                value_type => 'uniline',
+                value_type => 'string',
                 description =>
 'Another way to specify a default value. But this default value is considered as "built_in" the application and is not written in the configuration data (unless modified)',
                 warp => {
@@ -284,10 +284,10 @@ my %assert_payload = (
                 level      => 'hidden',
                 description =>
                     'Perl regular expression to assert the validity of the value. To check the '
-                    . q!whole value, use C<^> and C<$>. For instance C<^foo|bar$> will allow !
+                    . q!whole value, use C<^> and C<$>. For instance C<^foo|bar$> allows !
                     . q!C<foo> or C<bar> but not C<foobar>. To be case insentive, !
                     . q!use the C<(?i)> extended pattern. For instance, the regexp !
-                    . q!C<^(?i)foo|bar$> will also allow the values !
+                    . q!C<^(?i)foo|bar$> also allows the values !
                     . q!C<Foo> and C<Bar>.!,
                 @warp_in_uniline_or_string,
             },
@@ -295,8 +295,8 @@ my %assert_payload = (
             'assert' => {
                 %assert_payload,
                 description =>
-                  'Raise an error if the test code snippet does returns false. Note this snippet will '
-                  . 'also be run on undefined value, which may not be what you want.',
+                  'Raise an error if the test code snippet does returns false. Note this snippet is '
+                  . 'also run on undefined value, which may not be what you want.',
             },
 
             'warn_if' => {
diff --git a/lib/Config/Model/models/Itself/CommonElement/Assert.pod b/lib/Config/Model/models/Itself/CommonElement/Assert.pod
index 8100cbe..bc79e47 100644
--- a/lib/Config/Model/models/Itself/CommonElement/Assert.pod
+++ b/lib/Config/Model/models/Itself/CommonElement/Assert.pod
@@ -14,15 +14,15 @@ Configuration classes used by L<Config::Model>
 
 =head2 code
 
-Perl instructions to test the value. $_ will contain the value to test. C<$self> will contain the value object. Use with care. I<< Optional. Type string.  >> 
+Perl instructions to test the value. $_ contains the value to test. C<$self> contains the value object. Use with care. I<< Optional. Type string.  >> 
 
 =head2 msg
 
-Warning message to show user. "$_" will contain the bad value. Example "value $_ is bad". Leave blank or undef to use generated message. I<< Optional. Type string.  >> 
+Warning message to show user. "$_" contains the bad value. Example "value $_ is bad". Leave blank or undef to use generated message. I<< Optional. Type string.  >> 
 
 =head2 fix
 
-Perl instructions to fix the value. These instructions may be triggered by user. $_ will contain the value to fix.  $_ will be stored as the new value once the instructions are done. C<$self> will contain the value object. Use with care. I<< Optional. Type string.  >> 
+Perl instructions to fix the value. These instructions may be triggered by user. $_ contains the value to fix.  $_ is stored as the new value once the instructions are done. C<$self> contains the value object. Use with care. I<< Optional. Type string.  >> 
 
 =head1 SEE ALSO
 
diff --git a/lib/Config/Model/models/Itself/CommonElement/WarnIfMatch.pod b/lib/Config/Model/models/Itself/CommonElement/WarnIfMatch.pod
index 84f7bfe..5d3e8c2 100644
--- a/lib/Config/Model/models/Itself/CommonElement/WarnIfMatch.pod
+++ b/lib/Config/Model/models/Itself/CommonElement/WarnIfMatch.pod
@@ -14,11 +14,11 @@ Configuration classes used by L<Config::Model>
 
 =head2 msg
 
-Warning message to show user. "$_" will contain the bad value. Example "value $_ is bad". Leave blank or undef to use generated message. I<< Optional. Type string.  >> 
+Warning message to show user. "$_" contains the bad value. Example "value $_ is bad". Leave blank or undef to use generated message. I<< Optional. Type string.  >> 
 
 =head2 fix
 
-Perl instructions to fix the value. These instructions may be triggered by user. $_ will contain the value to fix.  $_ will be stored as the new value once the instructions are done. C<$self> will contain the value object. Use with care. I<< Optional. Type string.  >> 
+Perl instructions to fix the value. These instructions may be triggered by user. $_ contains the value to fix.  $_ is stored as the new value once the instructions are done. C<$self> contains the value object. Use with care. I<< Optional. Type string.  >> 
 
 =head1 SEE ALSO
 
diff --git a/lib/Config/Model/models/Itself/ComputedValue.pl b/lib/Config/Model/models/Itself/ComputedValue.pl
index 72d285c..b3eeae3 100644
--- a/lib/Config/Model/models/Itself/ComputedValue.pl
+++ b/lib/Config/Model/models/Itself/ComputedValue.pl
@@ -1,48 +1,43 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
 #   The GNU Lesser General Public License, Version 2.1, February 1999
 #
 [
-  [
-   name => "Itself::ComputedValue",
-   include => "Itself::MigratedValue" ,
-
-   'element' 
-   => [
-
-       'allow_override' 
-       => { type => 'leaf',
-
-	    value_type => 'boolean',
-	    compute => {
-                formula => '$upstream_knowns',
-                variables => {
-                    upstream_knowns => '- use_as_upstream_default',
+    [
+        name => "Itself::ComputedValue",
+        include => "Itself::MigratedValue" ,
+
+        element => [
+            allow_override => {
+                type => 'leaf',
+                value_type => 'boolean',
+                compute => {
+                    formula => '$upstream_knowns',
+                    variables => {
+                        upstream_knowns => '- use_as_upstream_default',
+                    },
+                    use_as_upstream_default => 1,
                 },
-                use_as_upstream_default => 1,
+                level => 'normal',
+                description => "Allow user to override computed value"
+                    .'For more details, see L<doc|Config::Model::ValueComputer.pm/"compute override"> ',,
             },
 
-	    level => 'normal',
-	    description => "Allow user to override computed value",
-	 },
-
-       'use_as_upstream_default' 
-       => { type => 'leaf',
-
-	    value_type => 'boolean',
-	    upstream_default   => 0,
-	    level => 'normal',
-	    description => "Indicate that the computed value is known by the "
-                ."application and does not need to be written in the configuration file. Implies allow_override."
-	 },
-
-      ],
+            use_as_upstream_default => {
+                type => 'leaf',
+                value_type => 'boolean',
+                upstream_default   => 0,
+                level => 'normal',
+                description => "Indicate that the computed value is known by the "
+                    ."application and does not need to be written in the configuration file. Implies allow_override."
+                },
+        ],
 
-  ],
+    ],
 
 ];
diff --git a/lib/Config/Model/models/Itself/ConfigAccept.pod b/lib/Config/Model/models/Itself/ConfigAccept.pod
index fe87102..5881df2 100644
--- a/lib/Config/Model/models/Itself/ConfigAccept.pod
+++ b/lib/Config/Model/models/Itself/ConfigAccept.pod
@@ -18,7 +18,7 @@ B<Deprecated> I<< Optional. Type uniline. upstream_default: '.*'.  >>
 
 =head2 accept_after
 
-specify where to insert accepted element. This will not change the behavior but will help generating more consistent  user interfaces. I<< Optional. Type reference.  >> 
+specify where to insert accepted element. This does not change the behavior and helps generating more consistent  user interfaces. I<< Optional. Type reference.  >> 
 
 =head2 type
 
@@ -50,7 +50,7 @@ Perl class name used to override the implementation of the configuration element
 
 =head2 morph
 
-When set, a recurse copy of the value from the old object to the new object will be attemped. When a copy is not possible, undef values will be assigned. I<< Optional. Type boolean.  >> 
+When set, a recurse copy of the value from the old object to the new object is attemped. Old values are dropped when  a copy is not possible (usually because of mismatching types) I<< Optional. Type boolean.  >> 
 
 =head2 refer_to
 
@@ -114,11 +114,11 @@ maximum number of keys. I<< Optional. Type integer.  >>
 
 =head2 default
 
-Specify default value. This default value will be written in the configuration data. I<< Optional. Type uniline.  >> 
+Specify default value. This default value is written in the configuration data. I<< Optional. Type string.  >> 
 
 =head2 upstream_default
 
-Another way to specify a default value. But this default value is considered as "built_in" the application and is not written in the configuration data (unless modified) I<< Optional. Type uniline.  >> 
+Another way to specify a default value. But this default value is considered as "built_in" the application and is not written in the configuration data (unless modified) I<< Optional. Type string.  >> 
 
 =head2 convert
 
@@ -126,11 +126,11 @@ Convert value or index to uppercase (uc) or lowercase (lc). I<< Optional. Type e
 
 =head2 match
 
-Perl regular expression to assert the validity of the value. To check the whole value, use C<^> and C<$>. For instance C<^foo|bar$> will allow C<foo> or C<bar> but not C<foobar>. To be case insentive, use the C<(?i)> extended pattern. For instance, the regexp C<^(?i)foo|bar$> will also allow the values C<Foo> and C<Bar>. I<< Optional. Type uniline.  >> 
+Perl regular expression to assert the validity of the value. To check the whole value, use C<^> and C<$>. For instance C<^foo|bar$> allows C<foo> or C<bar> but not C<foobar>. To be case insentive, use the C<(?i)> extended pattern. For instance, the regexp C<^(?i)foo|bar$> also allows the values C<Foo> and C<Bar>. I<< Optional. Type uniline.  >> 
 
 =head2 assert
 
-Raise an error if the test code snippet does returns false. Note this snippet will also be run on undefined value, which may not be what you want. I<< Optional. Type hash of node of class L<Itself::CommonElement::Assert|Config::Model::models::Itself::CommonElement::Assert> .  >> 
+Raise an error if the test code snippet does returns false. Note this snippet is also run on undefined value, which may not be what you want. I<< Optional. Type hash of node of class L<Itself::CommonElement::Assert|Config::Model::models::Itself::CommonElement::Assert> .  >> 
 
 =head2 warn_if
 
@@ -166,7 +166,7 @@ Specify items checked by default in the application. I<< Optional. Type check_li
 
 =head2 allow_keys_from
 
-this hash will allow keys from the keys of the hash pointed by the path string. I<< Optional. Type uniline.  >> 
+this hash allows keys from the keys of the hash pointed by the path string. I<< Optional. Type uniline.  >> 
 
 =head2 allow_keys_matching
 
@@ -174,7 +174,7 @@ Keys must match the specified regular expression. I<< Optional. Type uniline.  >
 
 =head2 follow_keys_from
 
-this hash will contain the same keys as the hash pointed by the path string. I<< Optional. Type uniline.  >> 
+this hash contains the same keys as the hash pointed by the path string. I<< Optional. Type uniline.  >> 
 
 =head2 warn_if_key_match
 
diff --git a/lib/Config/Model/models/Itself/ConfigRead.pod b/lib/Config/Model/models/Itself/ConfigRead.pod
index 3c599c8..371c2c2 100644
--- a/lib/Config/Model/models/Itself/ConfigRead.pod
+++ b/lib/Config/Model/models/Itself/ConfigRead.pod
@@ -56,7 +56,11 @@ Specify and alternate location of a configuration directory depending on the OS
 
 =head2 file - target configuration file name
 
-specify the configuration file name. This parameter may not be applicable depending on your application. It may also be hardcoded in a custom backend. If not specified, the instance name will be used as base name for your configuration file. I<< Optional. Type uniline.  >> 
+specify the configuration file name. This parameter may not be applicable depending on your application. It may also be hardcoded in a custom backend. If not specified, the instance name is used as base name for your configuration file. The configuration file namecan be specified with &index keyword when a backend is associated to a node contained in a hash. See L<backend specifications|http://search.cpan.org/dist/Config-Model/lib/Config/Model/BackendMgr.pm#Backend_specification>. I<< Op [...]
+
+=head2 file_mode - configuration file mode
+
+specify the configuration file mode. C<file_mode> parameter can be used to set the mode of the written file. C<file_mode> value can be in any form suppported by L<Path::Tiny/chmod>. I<< Optional. Type uniline.  >> 
 
 =head2 default_layer - How to find default values in a global config file
 
@@ -68,11 +72,11 @@ I<< Optional. Type uniline.  >>
 
 =head2 store_class_in_hash
 
-Specify element hash name that will contain all INI classes. See L<Config::Model::Backend::IniFile/"Arbitrary class name"> I<< Optional. Type uniline.  >> 
+Specify element hash name that contains all INI classes. See L<Config::Model::Backend::IniFile/"Arbitrary class name"> I<< Optional. Type uniline.  >> 
 
 =head2 section_map
 
-Specify element name that will contain one INI class. E.g. to store INI class [foo] in element Foo, specify { foo => "Foo" } I<< Optional. Type hash of uniline.  >> 
+Specify element name that contains one INI class. E.g. to store INI class [foo] in element Foo, specify { foo => "Foo" } I<< Optional. Type hash of uniline.  >> 
 
 =head2 split_list_value
 
@@ -112,7 +116,7 @@ Also dump default values in the data structure. Useful if the dumped configurati
 
 =head2 comment_delimiter
 
-comment starts with this character. I<< Optional. Type uniline. upstream_default: '#'.  >> 
+list of characters that start a comment. When more that one character is used. the first one is used to write back comment. For instance, value "#;" indicate that a comments can start with "#" or ";" and that all comments are written back with "#". I<< Optional. Type uniline. upstream_default: '#'.  >> 
 
 =head2 auto_delete - Delete empty configuration file
 
diff --git a/lib/Config/Model/models/Itself/ConfigWR/DefaultLayer.pod b/lib/Config/Model/models/Itself/ConfigWR/DefaultLayer.pod
index 1b3a2e1..0ab8410 100644
--- a/lib/Config/Model/models/Itself/ConfigWR/DefaultLayer.pod
+++ b/lib/Config/Model/models/Itself/ConfigWR/DefaultLayer.pod
@@ -22,7 +22,7 @@ Specify and alternate location of a configuration directory depending on the OS
 
 =head2 file - target configuration file name
 
-specify the configuration file name. This parameter may not be applicable depending on your application. It may also be hardcoded in a custom backend. If not specified, the instance name will be used as base name for your configuration file. I<< Optional. Type uniline.  >> 
+specify the configuration file name. This parameter may not be applicable depending on your application. It may also be hardcoded in a custom backend. If not specified, the instance name is used as base name for your configuration file. The configuration file namecan be specified with &index keyword when a backend is associated to a node contained in a hash. See L<backend specifications|http://search.cpan.org/dist/Config-Model/lib/Config/Model/BackendMgr.pm#Backend_specification>. I<< Op [...]
 
 =head1 SEE ALSO
 
diff --git a/lib/Config/Model/models/Itself/ConfigWrite.pod b/lib/Config/Model/models/Itself/ConfigWrite.pod
index e52b4a8..2c760d5 100644
--- a/lib/Config/Model/models/Itself/ConfigWrite.pod
+++ b/lib/Config/Model/models/Itself/ConfigWrite.pod
@@ -56,7 +56,11 @@ Specify and alternate location of a configuration directory depending on the OS
 
 =head2 file - target configuration file name
 
-specify the configuration file name. This parameter may not be applicable depending on your application. It may also be hardcoded in a custom backend. If not specified, the instance name will be used as base name for your configuration file. I<< Optional. Type uniline.  >> 
+specify the configuration file name. This parameter may not be applicable depending on your application. It may also be hardcoded in a custom backend. If not specified, the instance name is used as base name for your configuration file. The configuration file namecan be specified with &index keyword when a backend is associated to a node contained in a hash. See L<backend specifications|http://search.cpan.org/dist/Config-Model/lib/Config/Model/BackendMgr.pm#Backend_specification>. I<< Op [...]
+
+=head2 file_mode - configuration file mode
+
+specify the configuration file mode. C<file_mode> parameter can be used to set the mode of the written file. C<file_mode> value can be in any form suppported by L<Path::Tiny/chmod>. I<< Optional. Type uniline.  >> 
 
 =head2 default_layer - How to find default values in a global config file
 
@@ -68,11 +72,11 @@ I<< Optional. Type uniline.  >>
 
 =head2 store_class_in_hash
 
-Specify element hash name that will contain all INI classes. See L<Config::Model::Backend::IniFile/"Arbitrary class name"> I<< Optional. Type uniline.  >> 
+Specify element hash name that contains all INI classes. See L<Config::Model::Backend::IniFile/"Arbitrary class name"> I<< Optional. Type uniline.  >> 
 
 =head2 section_map
 
-Specify element name that will contain one INI class. E.g. to store INI class [foo] in element Foo, specify { foo => "Foo" } I<< Optional. Type hash of uniline.  >> 
+Specify element name that contains one INI class. E.g. to store INI class [foo] in element Foo, specify { foo => "Foo" } I<< Optional. Type hash of uniline.  >> 
 
 =head2 split_list_value
 
@@ -112,7 +116,7 @@ Also dump default values in the data structure. Useful if the dumped configurati
 
 =head2 comment_delimiter
 
-comment starts with this character. I<< Optional. Type uniline. upstream_default: '#'.  >> 
+list of characters that start a comment. When more that one character is used. the first one is used to write back comment. For instance, value "#;" indicate that a comments can start with "#" or ";" and that all comments are written back with "#". I<< Optional. Type uniline. upstream_default: '#'.  >> 
 
 =head2 auto_delete - Delete empty configuration file
 
diff --git a/lib/Config/Model/models/Itself/Element.pl b/lib/Config/Model/models/Itself/Element.pl
index c4499a8..8120511 100644
--- a/lib/Config/Model/models/Itself/Element.pl
+++ b/lib/Config/Model/models/Itself/Element.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/lib/Config/Model/models/Itself/Element.pod b/lib/Config/Model/models/Itself/Element.pod
index 06039b0..42adc3c 100644
--- a/lib/Config/Model/models/Itself/Element.pod
+++ b/lib/Config/Model/models/Itself/Element.pod
@@ -42,7 +42,7 @@ Perl class name used to override the implementation of the configuration element
 
 =head2 morph
 
-When set, a recurse copy of the value from the old object to the new object will be attemped. When a copy is not possible, undef values will be assigned. I<< Optional. Type boolean.  >> 
+When set, a recurse copy of the value from the old object to the new object is attemped. Old values are dropped when  a copy is not possible (usually because of mismatching types) I<< Optional. Type boolean.  >> 
 
 =head2 refer_to
 
@@ -106,11 +106,11 @@ maximum number of keys. I<< Optional. Type integer.  >>
 
 =head2 default
 
-Specify default value. This default value will be written in the configuration data. I<< Optional. Type uniline.  >> 
+Specify default value. This default value is written in the configuration data. I<< Optional. Type string.  >> 
 
 =head2 upstream_default
 
-Another way to specify a default value. But this default value is considered as "built_in" the application and is not written in the configuration data (unless modified) I<< Optional. Type uniline.  >> 
+Another way to specify a default value. But this default value is considered as "built_in" the application and is not written in the configuration data (unless modified) I<< Optional. Type string.  >> 
 
 =head2 convert
 
@@ -118,11 +118,11 @@ Convert value or index to uppercase (uc) or lowercase (lc). I<< Optional. Type e
 
 =head2 match
 
-Perl regular expression to assert the validity of the value. To check the whole value, use C<^> and C<$>. For instance C<^foo|bar$> will allow C<foo> or C<bar> but not C<foobar>. To be case insentive, use the C<(?i)> extended pattern. For instance, the regexp C<^(?i)foo|bar$> will also allow the values C<Foo> and C<Bar>. I<< Optional. Type uniline.  >> 
+Perl regular expression to assert the validity of the value. To check the whole value, use C<^> and C<$>. For instance C<^foo|bar$> allows C<foo> or C<bar> but not C<foobar>. To be case insentive, use the C<(?i)> extended pattern. For instance, the regexp C<^(?i)foo|bar$> also allows the values C<Foo> and C<Bar>. I<< Optional. Type uniline.  >> 
 
 =head2 assert
 
-Raise an error if the test code snippet does returns false. Note this snippet will also be run on undefined value, which may not be what you want. I<< Optional. Type hash of node of class L<Itself::CommonElement::Assert|Config::Model::models::Itself::CommonElement::Assert> .  >> 
+Raise an error if the test code snippet does returns false. Note this snippet is also run on undefined value, which may not be what you want. I<< Optional. Type hash of node of class L<Itself::CommonElement::Assert|Config::Model::models::Itself::CommonElement::Assert> .  >> 
 
 =head2 warn_if
 
@@ -158,7 +158,7 @@ Specify items checked by default in the application. I<< Optional. Type check_li
 
 =head2 allow_keys_from
 
-this hash will allow keys from the keys of the hash pointed by the path string. I<< Optional. Type uniline.  >> 
+this hash allows keys from the keys of the hash pointed by the path string. I<< Optional. Type uniline.  >> 
 
 =head2 allow_keys_matching
 
@@ -166,7 +166,7 @@ Keys must match the specified regular expression. I<< Optional. Type uniline.  >
 
 =head2 follow_keys_from
 
-this hash will contain the same keys as the hash pointed by the path string. I<< Optional. Type uniline.  >> 
+this hash contains the same keys as the hash pointed by the path string. I<< Optional. Type uniline.  >> 
 
 =head2 warn_if_key_match
 
diff --git a/lib/Config/Model/models/Itself/MigratedValue.pl b/lib/Config/Model/models/Itself/MigratedValue.pl
index a2dbc4d..869604b 100644
--- a/lib/Config/Model/models/Itself/MigratedValue.pl
+++ b/lib/Config/Model/models/Itself/MigratedValue.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
@@ -9,53 +9,60 @@
 #
 
 [
-  [
-   name => "Itself::MigratedValue",
+    [
+        name => "Itself::MigratedValue",
 
-   'element' 
-   => [
-       'variables',
-       => {
-	   type => 'hash',
-	   index_type => 'string' ,
-	   cargo => { type => 'leaf', value_type => 'uniline' } ,
-	   description => 'Specify where to find the variables using path notation. For the formula "$a + $b", you need to specify "a => \'- a_path\', b => \'! b_path\' ',
-	  },
+        element => [
+            variables => {
+                type => 'hash',
+                index_type => 'string' ,
+                cargo => { type => 'leaf', value_type => 'uniline' } ,
+                description => 'Specify where to find the variables using path notation. For the formula '
+                    .'"$a + $b", you need to specify "a => \'- a_path\', b => \'! b_path\'. '
+                    .'Functions like C<&index()> are allowed. '
+                    .'For more details, see L<doc|Config::Model::ValueComputer.pm/"Compute variables"> ',
+            },
 
-       'formula' => { type => 'leaf',
-		      value_type => 'string',
-		      # making formula mandatory makes mandatory setting the
-		      # compute parameter for a leaf. That's not a
-		      # desired behavior.
-		      # mandatory => 1 ,
-		      description => 'Specify how the computation is done. This string can a Perl expression for integer value or a template for string values. Variables have the same notation than in Perl. Example "$a + $b" ',
-		    },
-       'replace'
-       => {
-	   type => 'hash',
-	   index_type => 'string' ,
-	   cargo => { type => 'leaf', value_type => 'string' } ,
-	   description => 'Sometime, using the value of a tree leaf is not enough and you need to substitute a replacement for any value you can get. This replacement can be done using a hash like notation within the formula using the %replace hash. Example $replace{$who} , where "who => \'- who_elt\' ',
-	  },
-
-       'use_eval'
-       => { type => 'leaf',
-	    value_type => 'boolean',
-	    upstream_default   => 0,
-	    description => 'Set to 1 if you need to perform more complex operations than substition, like extraction with regular expressions. This will force an eval by Perl when computing the formula. The result of the eval will be used as the computed value.'
-	  },
-       'undef_is'
-       => { type => 'leaf',
-	    value_type => 'uniline',
-	    description => 'Specify a replacement for undefined variables. This will replace undef'
-	    .' values in the formula before migrating values. Use \'\' (2 single quotes) '
-	    . 'if you want to specify an empty string',
-	  },
-
-
-
-      ],
-
-  ],
+            formula => {
+                type => 'leaf',
+                value_type => 'string',
+                # making formula mandatory makes mandatory setting the
+                # compute parameter for a leaf. That's not a
+                # desired behavior.
+                # mandatory => 1 ,
+                description => 'Specify how the computation is done. This string can a Perl expression for '
+                    .'integer value or a template for string values. Variables have the same notation '
+                    .'than in Perl. Example "$a + $b". '
+                    .'Functions like C<&index()> are allowed. '
+                    .'For more details, see L<doc|Config::Model::ValueComputer.pm/"Compute formula"> ',
+            },
+            replace => {
+                type => 'hash',
+                index_type => 'string' ,
+                cargo => { type => 'leaf', value_type => 'string' } ,
+                description => 'Sometime, using the value of a tree leaf is not enough and you need to '
+                    .'substitute a replacement for any value you can get. This replacement can be done '
+                    .'using a hash like notation within the formula using the %replace hash. Example '
+                    .'$replace{$who} , where "who => \'- who_elt\'.  '
+                    .'For more details, see L<doc|Config::Model::ValueComputer.pm/"Compute replace">',
+            },
 
+            use_eval => {
+                type => 'leaf',
+                value_type => 'boolean',
+                upstream_default   => 0,
+                description => 'Set to 1 if you need to perform more complex operations than substition, '
+                    .'like extraction with regular expressions. This forces an eval by Perl when '
+                    .'computing the formula. The result of the eval is used as the computed value.'
+            },
+            undef_is => {
+                type => 'leaf',
+                value_type => 'uniline',
+                description => 'Specify a replacement for undefined variables. This replaces C<undef>'
+                    .' values in the formula before migrating values. Use \'\' (2 single quotes) '
+                    . 'if you want to specify an empty string.  '
+                    .'For more details, see L<doc|Config::Model::ValueComputer.pm/"Undefined variables">',
+            },
+        ],
+    ],
 ];
diff --git a/lib/Config/Model/models/Itself/Model.pl b/lib/Config/Model/models/Itself/Model.pl
index b3f5a99..aa7faec 100644
--- a/lib/Config/Model/models/Itself/Model.pl
+++ b/lib/Config/Model/models/Itself/Model.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/lib/Config/Model/models/Itself/NonWarpableElement.pl b/lib/Config/Model/models/Itself/NonWarpableElement.pl
index c6c389b..7db856b 100644
--- a/lib/Config/Model/models/Itself/NonWarpableElement.pl
+++ b/lib/Config/Model/models/Itself/NonWarpableElement.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
@@ -85,8 +85,8 @@
                 },
                 description =>
                   "When set, a recurse copy of the value from the old object "
-                  . "to the new object will be attemped. When a copy is not possible, "
-                  . "undef values will be assigned.",
+                  . "to the new object is attemped. Old values are dropped when "
+                  ." a copy is not possible (usually because of mismatching types) "
             },
 
             # end warp elements for warped_node
diff --git a/lib/Config/Model/models/Itself/WarpOnlyElement.pl b/lib/Config/Model/models/Itself/WarpOnlyElement.pl
index 617b984..33f23ae 100644
--- a/lib/Config/Model/models/Itself/WarpOnlyElement.pl
+++ b/lib/Config/Model/models/Itself/WarpOnlyElement.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/lib/Config/Model/models/Itself/WarpValue.pl b/lib/Config/Model/models/Itself/WarpValue.pl
index e6c8aa9..2e424fc 100644
--- a/lib/Config/Model/models/Itself/WarpValue.pl
+++ b/lib/Config/Model/models/Itself/WarpValue.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
@@ -21,7 +21,10 @@
 	   type => 'hash',
 	   index_type =>'string',
 	   cargo => { type => 'leaf', value_type => 'uniline' } ,
-	   description => 'Specify with a path the configuration element that will drive the warp , i.e .the elements that control the property change. These a specified using a variable name (used in the "rules" formula) and a path to fetch the actual value. Example $country => " ! country"',
+	   description => 'Specify with the pathof the configuration element that drives '
+           .'the warp, i.e .the elements that control the property change. '
+           .'These are specified using a variable name (used in the "rules" formula)'
+           .'and a path to fetch the actual value. Example $country => " ! country"',
 	  },
        'rules' => {
 		   type => 'hash',
diff --git a/lib/Config/Model/models/Itself/WarpValue.pod b/lib/Config/Model/models/Itself/WarpValue.pod
index 77eff96..67ecd8b 100644
--- a/lib/Config/Model/models/Itself/WarpValue.pod
+++ b/lib/Config/Model/models/Itself/WarpValue.pod
@@ -16,7 +16,7 @@ Warp functionality enable a Value object to change its properties (i.e. default
 
 =head2 follow
 
-Specify with a path the configuration element that will drive the warp , i.e .the elements that control the property change. These a specified using a variable name (used in the "rules" formula) and a path to fetch the actual value. Example $country => " ! country" I<< Optional. Type hash of uniline.  >> 
+Specify with the pathof the configuration element that drives the warp, i.e .the elements that control the property change. These are specified using a variable name (used in the "rules" formula)and a path to fetch the actual value. Example $country => " ! country" I<< Optional. Type hash of uniline.  >> 
 
 =head2 rules
 
diff --git a/lib/Config/Model/models/Itself/WarpableCargoElement.pl b/lib/Config/Model/models/Itself/WarpableCargoElement.pl
index 9c9965d..6f57d66 100644
--- a/lib/Config/Model/models/Itself/WarpableCargoElement.pl
+++ b/lib/Config/Model/models/Itself/WarpableCargoElement.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
diff --git a/lib/Config/Model/models/Itself/WarpableElement.pl b/lib/Config/Model/models/Itself/WarpableElement.pl
index b34442c..ae7c312 100644
--- a/lib/Config/Model/models/Itself/WarpableElement.pl
+++ b/lib/Config/Model/models/Itself/WarpableElement.pl
@@ -1,7 +1,7 @@
 #
 # This file is part of Config-Model-Itself
 #
-# This software is Copyright (c) 2007-2016 by Dominique Dumont.
+# This software is Copyright (c) 2007-2017 by Dominique Dumont.
 #
 # This is free software, licensed under:
 #
@@ -148,8 +148,8 @@
         ],
 
         'description' => [
-            follow_keys_from => 'this hash will contain the same keys as the hash pointed by the path string',
-            allow_keys_from => 'this hash will allow keys from the keys of the hash pointed by the path string',
+            follow_keys_from => 'this hash contains the same keys as the hash pointed by the path string',
+            allow_keys_from => 'this hash allows keys from the keys of the hash pointed by the path string',
             ordered => 'keep track of the order of the elements of this hash',
             default_keys => 'default keys hashes.',
             auto_create_keys => 'always create a set of keys specified in this list',
diff --git a/t/cme-meta-plugin.t b/t/cme-meta-plugin.t
index 6859807..10f6686 100644
--- a/t/cme-meta-plugin.t
+++ b/t/cme-meta-plugin.t
@@ -47,16 +47,16 @@ SKIP: {
 
         my $result = test_app(
             'App::Cme' => [
-                qw/meta plugin fstab my-plugin.pl/,
+                qw/meta plugin fstab my-plugin/,
                 '-test-and-quit' => 's',
                 '-load' => $plug->stringify,
                 '-dir' => $wr_test->stringify,
             ]
         ) ;
 
-        like($result->stdout , qr/Preparing plugin for model Fstab/, "edit plugin and quit");
+        like($result->stdout , qr/Preparing plugin my-plugin for model Fstab/, "edit plugin and quit");
         like($result->stdout , qr/Test mode: save and quit/, "edit plugin is in test mode");
-        my $plug_out = $wr_test->child('Fstab/CommonOptions.d/my-plugin.pl');
+        my $plug_out = $wr_test->child('models/Fstab.d/my-plugin/Fstab/CommonOptions.pl');
         file_contents_like $plug_out,  qr/'mandatory' => '1'/, "check content of $plug_out";
     }
 }
diff --git a/t/itself_snippet.t b/t/itself_snippet.t
index e868258..1b1e112 100644
--- a/t/itself_snippet.t
+++ b/t/itself_snippet.t
@@ -37,7 +37,8 @@ Config::Model::Exception::Any->Trace(1) if $arg =~ /e/;
 
 my $wr_test = 'wr_test' ;
 my $wr_model1 = "$wr_test/wr_model1";
-my $wr_snippet = "$wr_test/wr_snippet";
+my $wr_plugin = "$wr_test/wr_plugin.d";
+my $plugin_name = 'my_plugin';
 
 my $meta_model = Config::Model -> new ( ) ;# model_dir => '.' );
 
@@ -60,40 +61,40 @@ find ({ wanted =>$wanted, no_chdir=>1} ,'data') ;
 
 
 
-# test model snippets, read model in layered mode
-my $meta_snippet_inst = $meta_model->instance(
+# test model plugins, read model in layered mode
+my $meta_plugin_inst = $meta_model->instance(
     root_class_name => 'Itself::Model',
-    instance_name   => 'itself_snippet',
+    instance_name   => 'itself_plugin',
     root_dir        => $wr_model1,
 );
-ok($meta_snippet_inst,"Read Itself::Model and created instance for model snippet") ;
+ok($meta_plugin_inst,"Read Itself::Model and created instance for model plugin") ;
 
-my $meta_snippet_root = $meta_snippet_inst -> config_root ;
+my $meta_plugin_root = $meta_plugin_inst -> config_root ;
 
-my $snippet_rw_obj = Config::Model::Itself -> new(
-    model_object => $meta_snippet_root,
+my $plugin_rw_obj = Config::Model::Itself -> new(
+    model_object => $meta_plugin_root,
     cm_lib_dir => 'data',
 ) ;
 
-$meta_snippet_inst->layered_start ;
+$meta_plugin_inst->layered_start ;
 
-$snippet_rw_obj -> read_all( 
+$plugin_rw_obj -> read_all( 
     root_model => 'MasterModel',
     legacy => 'ignore',
 ) ;
 
 ok(1,"Read all models in data dir in layered mode") ;
 
-$meta_snippet_inst->layered_stop ;
+$meta_plugin_inst->layered_stop ;
 
 # modify model, X_base_class2 is not a mistake
-$meta_snippet_root->load(q!class:MasterModel::X_base_class2 element:X#"X note" help:Cv="Mighty help for Cv"!);
-$meta_snippet_root->load(q!class:MasterModel element:a_string warn_if_match:meh msg="said meh"!);
+$meta_plugin_root->load(q!class:MasterModel::X_base_class2 element:X#"X note" help:Cv="Mighty help for Cv"!);
+$meta_plugin_root->load(q!class:MasterModel element:a_string warn_if_match:meh msg="said meh"!);
 
-$snippet_rw_obj->write_model_snippet(snippet_dir => $wr_snippet, model_file=> 'snippet.pl') ;
+$plugin_rw_obj->write_model_plugin(plugin_dir => $wr_plugin, plugin_name => $plugin_name) ;
 
-my %expected_snippet;
-$expected_snippet{MasterModel} = << "EOS" ;
+my %expected_plugin;
+$expected_plugin{MasterModel} = << "EOS" ;
 [
   {
     'element' => [
@@ -113,7 +114,7 @@ $expected_snippet{MasterModel} = << "EOS" ;
 
 EOS
 
-$expected_snippet{"MasterModel/X_base_class2"} = << "EOS" ;
+$expected_plugin{"MasterModel/X_base_class2"} = << "EOS" ;
 [
   {
     'element' => [
@@ -142,38 +143,39 @@ X note
 EOS
 
 map {
-  file_contents_eq_or_diff $wr_snippet."/$_.d/snippet.pl",  $expected_snippet{$_},  "genereted $_ snippet file";
-} keys %expected_snippet ;
+  file_contents_eq_or_diff $wr_plugin."/$plugin_name/$_.pl",  $expected_plugin{$_},  "generated $_ plugin file";
+} keys %expected_plugin ;
 
-my $meta_snippet_inst2 = $meta_model->instance(
+my $meta_plugin_inst2 = $meta_model->instance(
     root_class_name => 'Itself::Model',
-    instance_name   => 'itself_snippet',
+    instance_name   => 'itself_plugin',
     root_dir        => $wr_model1,
 );
-ok($meta_snippet_inst2,"Read Itself::Model and created instance for model snippet") ;
+ok($meta_plugin_inst2,"Read Itself::Model and created instance for model plugin") ;
 
-my $meta_snippet_root2 = $meta_snippet_inst2 -> config_root ;
+my $meta_plugin_root2 = $meta_plugin_inst2 -> config_root ;
 
-my $snippet_rw_obj2 = Config::Model::Itself -> new(
+my $plugin_rw_obj2 = Config::Model::Itself -> new(
     cm_lib_dir => 'data',
-    model_object => $meta_snippet_root2,
+    model_object => $meta_plugin_root2,
 ) ;
 
-$meta_snippet_inst2->layered_start ;
+$meta_plugin_inst2->layered_start ;
 
-$snippet_rw_obj2->read_all(
+$plugin_rw_obj2->read_all(
     root_model => 'MasterModel',
     legacy     => 'ignore',
 );
 
 ok(1,"Read all models in data dir in layered mode") ;
 
-$meta_snippet_inst->layered_stop ;
+$meta_plugin_inst->layered_stop ;
 
-$snippet_rw_obj2->read_model_snippet(snippet_dir => $wr_snippet, model_file=> 'snippet.pl') ;
+$plugin_rw_obj2->read_model_plugin(plugin_dir => $wr_plugin, plugin_name => $plugin_name) ;
 
-$snippet_rw_obj2->write_model_snippet(snippet_dir => $wr_snippet, model_file=> 'snippet2.pl') ;
+my $plugin_name2 = 'other_plugin';
+$plugin_rw_obj2->write_model_plugin(plugin_dir => $wr_plugin, plugin_name => $plugin_name2) ;
 
 map {
-  file_contents_eq_or_diff $wr_snippet."/$_.d/snippet2.pl",  $expected_snippet{$_},  "regenerated $_ snippet file";
-}  keys %expected_snippet  ;
+  file_contents_eq_or_diff $wr_plugin."/$plugin_name2/$_.pl",  $expected_plugin{$_},  "regenerated $_ plugin file";
+}  keys %expected_plugin  ;
diff --git a/t/pod.t b/t/pod.t
index fec6832..7e67468 100644
--- a/t/pod.t
+++ b/t/pod.t
@@ -4,5 +4,4 @@ use strict;
 use Test::More;
 eval "use Test::Pod 1.00";
 plan skip_all => "Test::Pod 1.00 required for testing POD" if $@;
-my @poddirs = qw( lib config-model-edit );
-all_pod_files_ok( all_pod_files( @poddirs ) );
+all_pod_files_ok(  );

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



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