Provided by: libparse-plainconfig-perl_2.06-1_all bug

NAME

       Parse::PlainConfig - Parser for plain-text configuration files

MODULE VERSION

       $Id: PlainConfig.pm,v 2.06 2008/07/07 22:59:35 acorliss Exp $

SYNOPSIS

         use Parse::PlainConfig;

         $conf = new Parse::PlainConfig;
         $conf = Parse::PlainConfig->new(
           'PARAM_DELIM' => '=',
           'FILE'        => '.myrc',
           'MAX_BYTES'   => 65536,
           'SMART_PARSER => 1,
           );

         $conf->property(PARAM_DELIM => '=');

         $rv = $conf->read('myconf.conf');
         $rv = $conf->read;
         $rv = $conf->readIfNewer;
         $conf->write('.myrc', 2);

         $conf->purge;

         @parameters = $conf->parameters;
         $conf->parameter(FOO => "bar");
         $value = $conf->parameter(FOO);
         $conf->describe(FOO => 'This is foo');
         $conf->coerce("string", qw(FOO BAR));

         @order = $conf->order;
         $conf->order(@new_order);

         $errstr = Parse::PlainConfig::ERROR;

         $rv = $conf->hasParameter('FOO');

       The following methods are only supported for backwards compatibility reasons.  They will
       likely be removed at some point in the future.

         # Use of the tags DELIM and PURGE are deprecated in favour of
         # PARAM_DELIM, LIST_DELIM, HASH_DELIM, and AUTOPURGE
         $conf = Parse::PlainConfig->new(
           'DELIM' => '=',
           'PURGE' => 1,
           );

         # As is the delim method since it works only on the tag delimiter
         $conf->delim('=');

         # Auto-purge should be enabled/disabled via the property method
         $conf->purge(1);

         # directives is replaced with parameters
         @directives = $conf->directives;

         # get/set methods are replaced with a unifed parameter method
         $field = $conf->get('KEY1');
         ($field1, $field2) = $conf->get(qw(KEY1 KEY2));
         $conf->set(KEY1 => 'foo', KEY2 => 'bar');

         # This was just a really bad idea to begin with, plus it's
         # effective broken at this point (only returns a copy of the
         # internal hash now, so it's effectively read-only)
         $hashref = $conf->getRef;

         # This is just a wrapper for the class function
         $errstr = $conf->error

REQUIREMENTS

       •   Paranoid

       •   Text::ParseWords

       •   Text::Tabs

DESCRIPTION

       Parse::PlainConfig provides OO objects which can parse and generate human-readable
       configuration files.

FILE SYNTAX

   TRADITIONAL USAGE
       The plain parser supports the reconstructions of relatively simple data structures.
       Simple string assignments and one-dimensional arrays and hashes are possible.  Below are
       are various examples of constructs:

         # Scalar assignment
         FIRST_NAME: Joe
         LAST_NAME: Blow

         # Array assignment
         FAVOURITE_COLOURS: red, yellow, green
         ACCOUNT_NUMBERS:  9956-234-9943211, \
                           2343232-421231445, \
                           004422-03430-0343

         # Hash assignment
         CARS:  crown_vic => 1982, \
                geo       => 1993

       As the example above demonstrates, all lines that begin with a '#' (leading whitespace is
       allowed) are ignored as comments.  if '#" occurs in any other position, it is accepted as
       part of the passed value.  This means that you cannot place comments on the same lines as
       values.

       All directives and associated values will have both leading and trailing whitespace
       stripped from them before being stored in the configuration hash.  Whitespace is allowed
       within both.

       In traditional mode (meaning no parameters are set to be coerced into a specific datatype)
       one must encapsulate list and hash delimiters with quotation marks in order to prevent the
       string from being split and stored as a list or hash.  Quotation marks that are a literal
       part of the string must be backslashed.

   SMART PARSER
       The new parser now provides some options to make the file syntax more convenient.  You can
       activate the smart parser by setting SMART_PARSER to a true value during object
       instantiation or via the property method.

       With the traditional parser you had to backslach the end of all preceding lines if you
       wanted to split a value into more than one line:

         FOO:  This line starts here \
               and ends here...

       With the smart parser enabled that is no longer necessary as long as the following lines
       are indented further than the first line:

         FOO:  This line starts here
               and ends here...

       Note:  The indentation is compared by byte count with no recognition of tab stops.  That
       means if you indent with spaces on the first line and indent with tabs on the following it
       may not concantenate those values.

       Another benefit of the smart parser is found when you specify a parameter to be of a
       specific datatype via the COERCE hash during object instantiation or the coerce method.
       For instance, the traditional parser requires you to encapsulate strings with quotation
       marks if they contain list or hash delimiters:

         Quote:  "\"It can't be that easy,\" he said."

       Also note how you had to escape quotation marks if they were to be a literal part of the
       string.  With this parameter set to be coerced to a scalar you can simply write:

         Quote:  "It can't be that easy," he said.

       Similarly, you don't have to quote hash delimiters in parameters set to be coerced into
       lists.  Quotation marks as part of an element value must be escaped, though, since
       unescaped quotation marks are assumed to encapsulate strings containing list delimiters
       you don't want to split on.

       Note: The previous versions of Parse::PlainConfig did not allow the user to set keys like:

         FOO: \
             bar

       or save empty assignments like

         FOO:

       This is no longer the case.  Both are now valid and honoured.

SECURITY

       WARNING: This parser will attempt to open what ever you pass to it for a filename as is.
       If this object is to be used in programs that run with permissions other than the calling
       user, make sure you sanitize any user-supplied filename strings before passing them to
       this object.

       This also uses a blocking b<flock> call to open the file for reading and writing.

FUNCTIONS

   Parse::PlainConfig::ERROR

METHODS

   new
         $conf = new Parse::PlainConfig;
         $conf = Parse::PlainConfig->new(
           'PARAM_DELIM' => '=',
           'FILE'        => '.myrc',
           'MAX_BYTES'   => 65536,
           'SMART_PARSER => 1,
           );

       The object constructor can be called with or without arguments.  Arguments available for
       use include:

         Argument        Default    Purpose
         =============================================================
         ORDER           []         Specifies specific order of
                                    fields to be used while writing
         FILE            undef      Filename for read/write ops
         PARAM_DELIM       ':'        Field/value delimiter
         LIST_DELIM      ','        List delimiter within field values
         HASH_DELIM      '=>'       Hash key/value delimiter within
                                    field values
         AUTOPURGE       0          Autopurge enabled/disabled
         COERCE          {}         Field coercion hash
         DEFAULTS        {}         Default field values
         SMART_PARSER    0          Smart parser enabled/disabled
         MAX_BYTES       16384      Integer denoting maximum bytes
                                    to read in any given file

       DELIM, PURGE, and  FORCE_SCALAR are still available for backwards compatibility, but may
       be removed in the future.  One should use PARAM_DELIM AUTOPURGE, and COERCE instead.

       COERCE is a hash of field name/data type pairs.  If a field is listed in this hash then
       their values will always be returned in the requested format of either string, list, or
       hash.  Any field coerced to string, for instance, will ignore list and hash delimiters and
       assume the entire value will always be string value.

       DEFAULTS is a hash of field name/value pairs.  This ensures that even if a field is not
       explicitly set (either in a conf file or programmatically) a default value can still be
       retrieved.

       SMART_PARSER removes the need to backslash end-of-lines to continue the value onto the
       next.  If the following line is indented further than the tag was it will automatically
       assume that the next line is a continuation of the previous.  It also affects the need to
       encapsulate coerced datatypes with quotation marks for irrelevant delimiters.

       AUTOPURGE erases all stored parameters and values before reading a file.  This does not,
       however, erase any values set for ORDER.

   property
         $conf->property(PARAM_DELIM => '=');

       This method sets or retrieves the specified property.  Please note that this overwrites
       the current value, even for those properties that are references to lists and hashes.

       If you're using this to set a property it will return a boolean true or false depending on
       the success of the operation.  If you're just retrieving a property it will return the
       value of the property.  If you ask for a nonexistent property it will croak.

   purge
         $conf->purge(1);
         $conf->purge;

       NOTE:  Use of this method to set the purge mode is deprecated and will be removed in the
       future.  For that please use the property method instead.

       This method either (re)sets the auto-purge mode, or performs an immediate manual purge.
       Auto-purge mode clears the configuration hash each time a configuration file is read, so
       that the internal configuration data consists solely of what is in that file.  If you
       wanted to combine the settings of multiple files that each may exclusively hold some
       directives, setting this to 'off' will load the combined configuration as you read each
       file.

       You can still clobber configuration values, of course, if the same directive is defined in
       multiple files.  In that case, the last file's value will be the one stored in the hash.

       This does not clear the order or coerce properties.

       Autopurge mode is disabled by default.

   read
         $rv = $conf->read('myconf.conf');
         $rv = $conf->read;

       The read method is called initially with a filename as the only argument.  This causes the
       parser to read the file and extract all of the configuration directives from it.

       You'll notice that you can also call the read method without an argument.  The name of the
       file read is stored internally, and if already set to a valid value (either by a previous
       call to read with a filename argument or by setting the FILE property) this will read that
       file's contents.

       The return value will be one if the file was successfully read and parsed, or zero
       otherwise.  The reason for failure can be read via Parse::PlainConfig::ERROR.

       This function will cause the program to croak if called without a filename ever being
       defined.

   readIfNewer
         $rv = $conf->readIfNewer;

       This method is used to reread & parse the file only if the mtime appears newer than when
       last read.  If the file was successfully reread or appears to be the same it will return
       true.  Any errors will be stored in Parse::PlainConfig::ERROR and it will return a false
       value.

       You can determine whether or not the file was read by the true value.  If it was re-read
       it will return 1.  If the file appears to be the same age it will return a 2.

   write
         $conf->write('.myrc', 2);

       This method writes the current configuration stored in memory to the specified file,
       either specified as the first argument, or as stored from an explicit or implicit read
       call.

       The second argument specifies what kind of whitespace padding, if any, to use with the
       directive/value delimiter.  The following values are recognised:

         Value    Meaning
         ================================================
         0        No padding (i.e., written as KEY:VALUE)
         1        Left padding (i.e., written as KEY :VALUE)
         2        Right padding (i.e., written as KEY: VALUE)
         3        Full padding (i.e., written as KEY : VALUE)

       Both arguments are optional.

   parameters
         @parameters = $conf->parameters;

       This method returns a list of all the names of the directives currently stored in the
       configuration hash in no particular order.

   parameter
         $value = $conf->parameter('SCALAR1');
         @values = $conf->parameter('LIST1');
         %values = $conf->parameter('HASH1');
         $conf->parameter('SCALAR1', "foo");
         $conf->parameter('LIST1', [qw(foo bar)]);
         $conf->parameter('HASH1', { foo => 'bar' });

       This method sets or retrieves the specified parameter.  Hash and list values are copied
       and returned as a list.  If the specified parameter is set to be coerced into a specific
       data type the specified value will be converted to that datatype.   This means you can do
       something like:

         # SCALAR1 will equal "foo , bar , roo" assuming LIST_DELIM is set to ','
         $conf->coerce(qw(string SCALAR1));
         $conf->parameter('SCALAR1', [qw(foo bar roo)]);

         # SCALAR1 will equal "foo => bar : roo => ''" assuming HASH_DELIM is set
         # to '=>' and LIST_DELIM is set to ':'
         $conf->parameter('SCALAR1', { 'foo' => 'bar', 'roo' => '' });

       In order for conversions to be somewhat predictable (in the case of hashes coerced into
       other values) hash key/value pairs will be assigned to string or list portions according
       to the alphabetic sort order of the keys.

   coerce
         $conf->coerce("string", "FOO", "BAR");

       This method configures the parser to coerce values into the specified datatype (either
       string, list, or hash) and immediately convert any existing values and store them into
       that datatype as well.

   describe
         $conf->describe(KEY1 => 'This is foo', KEY2 => 'This is bar');

       The describe method takes any number of key/description pairs which will be used as
       comments preceding the directives in any newly written conf file.  You are responsible for
       prepending a comment character to each line, as well as splitting along your desired text
       width.

   order
         @order = $conf->order;
         $conf->order(@new_order);

       This method returns the current order of the configuration directives as read from the
       file.   If called with a list as an argument, it will set the directive order with that
       list.  This method is probably of limited use except when you wish to control the order in
       which directives are written in new conf files.

       Please note that if there are more directives than are present in this list, those extra
       keys will still be included in the new file, but will appear in alphabetically sorted
       order at the end, after all of the keys present in the list.

   hasParameter
         $rv = $conf->hasParameter('FOO');

       This function allows you to see if a parameter has been defined or has a default set for
       it.  Returns a boolean value.

DEPRECATED METHODS

   delim
         $conf->delim('=');

       This method gets and/or sets the parameter name/value delimiter to be used in the conf
       files.  The default delimiter is ':'.  This can be multiple characters.

   directives
         @directives = $conf->directives;

       This method returns a list of all the names of the directives currently stored in the
       configuration hash in no particular order.

   get
         $field = $conf->get('KEY1');
         ($field1, $field2) = $conf->get(qw(KEY1 KEY2));

       The get method takes any number of directives to retrieve, and returns them.  Please note
       that both hash and list values are passed by reference.  In order to protect the internal
       state information, the contents of either reference is merely a copy of what is in the
       configuration object's hash.  This will not pass you a reference to data stored internally
       in the object.  Because of this, it's perfectly safe for you to shift off values from a
       list as you process it, and so on.

   set
         $conf->set(KEY1 => 'foo', KEY2 => 'bar');

       The set method takes any number of directive/value pairs and copies them into the internal
       configuration hash.

   get_ref
         $href = $conf->get_ref

       Note:  This used to give you a reference to the internal configuration hash so you could
       manipulate it directly.  It now only gives you a copy of the internal hash (actually, it's
       reconstructed has to make it look like the old data structure).  In short, any changes you
       make to this hash will be lost.

   error
         warn $conf->error;

       This method returns a zero-length string if no errors were registered with the last
       operation, or a text message describing the error.

DIAGNOSTICS

       Through the use of Paranoid::Debug this module will produce internal diagnostic output to
       STDERR.  It begins logging at log level 7.  To enable debugging output please see the pod
       for Paranoid::Debug.

HISTORY

         2002/01/18:  Original public release (v1.1)
         2006/05/26:  Complete rewrite (v2.0)

AUTHOR/COPYRIGHT

       (c) 2002 Arthur Corliss (corliss@digitalmages.com)