Revision history for Perl extension MooseX::ConfigFromFile
+0.05
+ - documentation corrected to demostrate how to properly override the
+ configfile method to provide a default from the consuming class, without
+ having to redefine the attribute itself
+
0.04 - Dec 17, 2011
- Call the configfile attribute default sub if it is a sub, not just a
string, just like MooseX::Getopt does (RT#73325, Karen Etheridge)
$configfile = $opts{configfile}
}
else {
- my $cfmeta = $class->meta->find_attribute_by_name('configfile');
+ # This would only succeed if the consumer had defined a new configfile
+ # sub to override the generated reader
$configfile = try { $class->configfile };
+
+ # this is gross, but since a lot of users have swapped in their own
+ # default subs, we have to keep calling it rather than calling a
+ # builder sub directly - and it might not even be a coderef either
+ my $cfmeta = $class->meta->find_attribute_by_name('configfile');
$configfile ||= $cfmeta->default if $cfmeta->has_default;
+
if (ref $configfile eq 'CODE') {
$configfile = $configfile->($class);
}
with 'MooseX::SomeSpecificConfigRole';
# optionally, default the configfile:
- sub configfile { '/tmp/foo.yaml' }
+ around configfile => sub { '/tmp/foo.yaml' };
# ... insert your stuff here ...
This is a L<Path::Class::File> object which can be coerced from a regular pathname
string. This is the file your attributes are loaded from. You can add a default
-configfile in the class using the role and it will be honored at the appropriate time:
+configfile in the consuming class and it will be honored at the appropriate time
+(note that a simple sub declaration is not sufficient, as there is already a
+sub by that name being added by Moose as the attribute reader)
- has +configfile ( default => '/etc/myapp.yaml' );
+ around configfile => sub { '/etc/myapp.yaml' };
Note that you can alternately just provide a C<configfile> method which returns
the config file when called - this will be used in preference to the default of
--- /dev/null
+use strict;
+use warnings;
+
+use Test::More tests => 10;
+use Test::Fatal;
+use Test::Deep '!blessed';
+use Test::NoWarnings 1.04 ':early';
+use Scalar::Util 'blessed';
+
+my %loaded_file;
+my %default_sub;
+
+
+# nothing special going on here
+{
+ package Generic;
+ use Moose;
+ with 'MooseX::SimpleConfig';
+ sub get_config_from_file { }
+}
+
+is(
+ exception {
+ my $obj = Generic->new_with_config;
+ is($obj->configfile, undef, 'no configfile set');
+ },
+ undef,
+ 'no exceptions',
+);
+
+
+# this is a classic legacy usecase from old documentation that we must
+# continue to support
+{
+ package OverriddenDefault;
+ use Moose;
+ with 'MooseX::SimpleConfig';
+ sub get_config_from_file
+ {
+ my ($class, $file) = @_;
+ $loaded_file{$file}++;
+ +{}
+ }
+ has '+configfile' => (
+ default => 'OverriddenDefault file',
+ );
+}
+
+is(
+ exception {
+ my $obj = OverriddenDefault->new_with_config;
+ is($obj->configfile, blessed($obj) . ' file', 'configfile set via overridden default');
+ is($loaded_file{blessed($obj) . ' file'}, 1, 'correct file was loaded from');
+ },
+ undef,
+ 'no exceptions',
+);
+
+
+# "reader" method is overridden to provide for configfile default
+{
+ package OverriddenMethod;
+ use Moose;
+ with 'MooseX::SimpleConfig';
+ sub get_config_from_file {
+ my ($class, $file) = @_;
+ $loaded_file{$file}++;
+ +{}
+ }
+
+ around configfile => sub {
+ my $class = blessed($_[1]) || $_[1];
+ $default_sub{$class}++;
+ $class . ' file'
+ };
+}
+
+is(
+ exception {
+ my $obj = OverriddenMethod->new_with_config;
+ is($obj->configfile, blessed($obj) . ' file', 'configfile set via overridden sub');
+ ok($default_sub{blessed($obj)}, 'default sub was called');
+ is($loaded_file{blessed($obj) . ' file'}, 1, 'correct file was loaded from');
+ },
+ undef,
+ 'no exceptions',
+);
+
+