|
NAMEConfig::Model::Value - Strongly typed configuration valueVERSIONversion 2.149SYNOPSISuse Config::Model; # define configuration tree object my $model = Config::Model->new; $model ->create_config_class ( name => "MyClass", element => [ [qw/foo bar/] => { type => 'leaf', value_type => 'string', description => 'foobar', } , country => { type => 'leaf', value_type => 'enum', choice => [qw/France US/], description => 'big countries', } , ], ) ; my $inst = $model->instance(root_class_name => 'MyClass' ); my $root = $inst->config_root ; # put data $root->load( steps => 'foo=FOO country=US' ); print $root->report ; # foo = FOO # DESCRIPTION: foobar # # country = US # DESCRIPTION: big countries DESCRIPTIONThis class provides a way to specify configuration value with the following properties:
Default valuesThere are several kind of default values. They depend on where these values are defined (or found).From the lowest default level to the "highest":
Then there is the value entered by the user. This overrides all kind of "default" value. The fetch_standard function returns the "highest" level of default value, but does not return a custom value, i.e. a value entered by the user. ConstructorValue object should not be created directly.Value model declarationA leaf element must be declared with the following parameters:
Value typesThis modules can check several value types:
Warp: dynamic value configurationThe Warp functionality enable a "Value" object to change its properties (i.e. default value or its type) dynamically according to the value of another "Value" object locate elsewhere in the configuration tree. (See Config::Model::Warper for an explanation on warp mechanism).For instance if you declare 2 "Value" element this way: $model ->create_config_class ( name => "TV_config_class", element => [ country => { type => 'leaf', value_type => 'enum', choice => [qw/US Europe Japan/] } , tv_standard => { # this example is getting old... type => 'leaf', value_type => 'enum', choice => [ qw/PAL NTSC SECAM/ ] warp => { follow => { # this points to the warp master c => '- country' }, rules => { '$c eq "US"' => { default => 'NTSC' }, '$c eq "France"' => { default => 'SECAM' }, '$c eq "Japan"' => { default => 'NTSC' }, '$c eq "Europe"' => { default => 'PAL' }, } } } , ] ); Setting "country" element to "US" means that "tv_standard" has a default value set to "NTSC" by the warp mechanism. Likewise, the warp mechanism enables you to dynamically change the possible values of an enum element: state => { type => 'leaf', value_type => 'enum', # example is admittedly silly warp => { follow => { c => '- country' }, rules => { '$c eq "US"' => { choice => ['Kansas', 'Texas' ] }, '$c eq "Europe"' => { choice => ['France', 'Spain' ] }, '$c eq "Japan"' => { choice => ['Honshu', 'Hokkaido' ] } } } } Cascaded warpingWarping value can be cascaded: "A" can be warped by "B" which can be warped by "C". But this feature should be avoided since it can lead to a model very hard to debug. Bear in mind that:
Value ReferenceTo set up an enumerated value where the possible choice depends on the key of a Config::Model::AnyId object, you must:
In this case, a "IdElementReference" object is created to handle the relation between this value object and the referred Id. See Config::Model::IdElementReference for details. Introspection methodsThe following methods returns the current value of the parameter of the value object (as declared in the model unless they were warped):
nameReturns the object name.get_typeReturns "leaf".can_storeReturns true if the value object can be assigned to. Return 0 for a read-only value (i.e. a computed value with no override allowed).get_choiceQuery legal values (only for enum types). Return an array (possibly empty).get_helpWith a parameter, returns the help string applicable to the passed value or undef.Without parameter returns a hash ref that contains all the help strings. get_infoReturns a list of information related to the value, like value type, default value. This should be used to provide some debug information to the user.For instance, "$val-"get-info> may return: [ 'type: string', 'mandatory: yes' ] error_msgReturns the error messages of this object (if any)warning_msgReturns warning concerning this value. Returns a list in list context and a string in scalar context.check_valueParameters: "( value )"Check the consistency of the value. "check_value" also accepts named parameters:
In scalar context, return 0 or 1. In array context, return an empty array when no error was found. In case of errors, returns an array of error strings that should be shown to the user. has_fixesReturns the number of fixes that can be applied to the current value.apply_fixesApplies the fixes to suppress the current warnings.checkParameters: "( [ value => foo ] )"Like "check_value". Also displays warnings on STDOUT unless "silent" parameter is set to 1. In this case,user is expected to retrieve them with "warning_msg". Without "value" argument, this method checks the value currently stored. is_bad_modeAccept a mode parameter. This function checks if the mode is accepted by "fetch" method. Returns an error message if not. For instance:if (my $err = $val->is_bad_mode('foo')) { croak "my_function: $err"; } This method is intented as a helper to avoid duplicating the list of accepted modes for functions that want to wrap fetch methods (like Config::Model::Dumper or Config::Model::DumpAsData) Information managementstoreParameters: "( $value )" or "value => ..., check => yes|no|skip ), silent => 0|1"Store value in leaf element. "check" parameter can be used to skip validation check (default is 'yes'). "silent" can be used to suppress warnings. Optional "callback" is now deprecated. clearClear the stored value. Further read returns the default value (or computed or migrated value).load_dataParameters: "( $value )"Called with the same parameters are "store" method. Load scalar data. Data is forwarded to "store" after checking that the passed value is not a reference. fetch_customReturns the stored value if this value is different from a standard setting or built in setting. In other words, returns undef if the stored value is identical to the default value or the computed value or the built in value.fetch_standardReturns the standard value as defined by the configuration model. The standard value can be either a preset value, a layered value, a computed value, a default value or a built-in default value.has_dataReturn true if the value contains information different from default or upstream default value.fetchCheck and fetch value from leaf element. The method can have one parameter (the fetch mode) or several pairs:
According to the "mode" parameter, this method returns either:
fetch_summaryReturns a truncated value when the value is a string or uniline that is too long to be displayed.user_valueReturns the value entered by the user. Does not use the default or computed value. Returns undef unless a value was actually stored.fetch_presetReturns the value entered in preset mode. Does not use the default or computed value. Returns undef unless a value was actually stored in preset mode.clear_presetDelete the preset value. (Even out of preset mode). Returns true if other data are still stored in the value (layered or user data). Returns false otherwise.fetch_layeredReturns the value entered in layered mode. Does not use the default or computed value. Returns undef unless a value was actually stored in layered mode.clear_layeredDelete the layered value. (Even out of layered mode). Returns true if other data are still stored in the value (layered or user data). Returns false otherwise.get( path => ..., mode => ... , check => ... )Get a value from a directory like path.set( path , value )Set a value from a directory like path.ExamplesNumber with min and max valuesbounded_number => { type => 'leaf', value_type => 'number', min => 1, max => 4, }, Mandatory valuemandatory_string => { type => 'leaf', value_type => 'string', mandatory => 1, }, mandatory_boolean => { type => 'leaf', value_type => 'boolean', mandatory => 1, }, Enum with help associated with each valueNote that the help specification is optional.enum_with_help => { type => 'leaf', value_type => 'enum', choice => [qw/a b c/], help => { a => 'a help' } }, Migrate old obsolete enum valueLegacy values "a1", "c1" and "foo/.*" are replaced with "a", "c" and "foo/".with_replace => { type => 'leaf', value_type => 'enum', choice => [qw/a b c/], replace => { a1 => 'a', c1 => 'c', 'foo/.*' => 'foo', }, }, Enforce value to match a regexpAn exception is triggered when the value does not match the "match" regular expression.match => { type => 'leaf', value_type => 'string', match => '^foo\d{2}$', }, Enforce value to match a Parse::RecDescent grammarmatch_with_parse_recdescent => { type => 'leaf', value_type => 'string', grammar => q{ token (oper token)(s?) oper: 'and' | 'or' token: 'Apache' | 'CC-BY' | 'Perl' }, }, Issue a warning if a value matches a regexpIssue a warning if the string contains upper case letters. Propose a fix that translate all capital letters to lower case.warn_if_capital => { type => 'leaf', value_type => 'string', warn_if_match => { '/A-Z/' => { fix => '$_ = lc;' } }, }, A specific warning can be specified: warn_if_capital => { type => 'leaf', value_type => 'string', warn_if_match => { '/A-Z/' => { fix => '$_ = lc;', mesg => 'NO UPPER CASE PLEASE' } }, }, Issue a warning if a value does NOT match a regexpwarn_unless => { type => 'leaf', value_type => 'string', warn_unless_match => { foo => { msg => '', fix => '$_ = "foo".$_;' } }, }, Always issue a warningalways_warn => { type => 'leaf', value_type => 'string', warn => 'Always warn whenever used', }, Computed valuesSee "Examples" in Config::Model::ValueComputer.UpgradeUpgrade is a special case when the configuration of an application has changed. Some parameters can be removed and replaced by another one. To avoid trouble on the application user side, Config::Model offers a possibility to handle the migration of configuration data through a special declaration in the configuration model.This declaration must:
Here an example where a URL parameter is changed to a set of 2 parameters (host and path): 'old_url' => { type => 'leaf', value_type => 'uniline', status => 'deprecated', }, 'host' => { type => 'leaf', value_type => 'uniline', # the formula must end with '$1' so the result of the capture is used # as the host value migrate_from => { formula => '$old =~ m!http://([\w\.]+)!; $1 ;', variables => { old => '- old_url' }, use_eval => 1, }, }, 'path' => { type => 'leaf', value_type => 'uniline', migrate_from => { formula => '$old =~ m!http://[\w\.]+(/.*)!; $1 ;', variables => { old => '- old_url' }, use_eval => 1, }, }, EXCEPTION HANDLINGWhen an error is encountered, this module may throw the following exceptions:Config::Model::Exception::Model Config::Model::Exception::Formula Config::Model::Exception::WrongValue Config::Model::Exception::WarpError See Config::Model::Exception for more details. AUTHORDominique Dumont, (ddumont at cpan dot org)SEE ALSOConfig::Model, Config::Model::Node, Config::Model::AnyId, Config::Model::Warper, Config::Model::Exception Config::Model::ValueComputer,AUTHORDominique DumontCOPYRIGHT AND LICENSEThis software is Copyright (c) 2005-2022 by Dominique Dumont.This is free software, licensed under: The GNU Lesser General Public License, Version 2.1, February 1999
Visit the GSP FreeBSD Man Page Interface. |