From f47e9d48a2d26e92723ae96d3d65a1ba005f426f Mon Sep 17 00:00:00 2001 From: Hakim Cassimally Date: Tue, 15 Jul 2014 17:14:00 +0000 Subject: Open311 Role for accepting default config file See also MooX::ConfigFromFile, but that's underdocumented and seems overengineered -- may be worth implementing if requirements become more complex however. (See also Config::Any, which is well worth doing in future, using YAML only reflects current usage in FMS though.) --- perllib/Open311/Endpoint/Role/ConfigFile.pm | 30 +++++++++++++++++++++++++++++ t/open311/endpoint/config1.yml | 1 + t/open311/endpoint/configfile.t | 23 ++++++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 perllib/Open311/Endpoint/Role/ConfigFile.pm create mode 100644 t/open311/endpoint/config1.yml create mode 100644 t/open311/endpoint/configfile.t diff --git a/perllib/Open311/Endpoint/Role/ConfigFile.pm b/perllib/Open311/Endpoint/Role/ConfigFile.pm new file mode 100644 index 000000000..1c4b83355 --- /dev/null +++ b/perllib/Open311/Endpoint/Role/ConfigFile.pm @@ -0,0 +1,30 @@ +package Open311::Endpoint::Role::ConfigFile; +use Moo::Role; +use Path::Tiny 'path'; +use Carp 'croak'; +use YAML (); +use Types::Standard qw( Maybe Str ); + +has config_file => ( + is => 'ro', + isa => Maybe[Str], +); + +around BUILDARGS => sub { + my $next = shift; + my $class = shift; + + my %args = @_; + if (my $config_file = $args{config_file}) { + my $cfg = path($config_file); + croak "$config_file is not a file" unless $cfg->is_file; + + my $config = YAML::LoadFile($cfg) or croak "Couldn't load config from $config_file"; + return $class->$next(%$config, %args); + } + else { + return $class->$next(%args); + } +}; + +1; diff --git a/t/open311/endpoint/config1.yml b/t/open311/endpoint/config1.yml new file mode 100644 index 000000000..c444f32c5 --- /dev/null +++ b/t/open311/endpoint/config1.yml @@ -0,0 +1 @@ +foo: baz diff --git a/t/open311/endpoint/configfile.t b/t/open311/endpoint/configfile.t new file mode 100644 index 000000000..7f41468ba --- /dev/null +++ b/t/open311/endpoint/configfile.t @@ -0,0 +1,23 @@ +use strict; use warnings; + +BEGIN { + package Foo; + use Moo; + with 'Open311::Endpoint::Role::ConfigFile'; + + has foo => ( is => 'ro', default => 'foo' ); +} + +package main; +use Test::More; + +is +Foo->new->foo, + 'foo', 'sanity'; +is +Foo->new( foo => 'bar')->foo, + 'bar', 'override'; +is +Foo->new( config_file => 't/open311/endpoint/config1.yml' )->foo, + 'baz', 'with config'; +is +Foo->new( config_file => 't/open311/endpoint/config1.yml', foo => 'qux' )->foo, + 'qux', 'with config, overridden'; + +done_testing; -- cgit v1.2.3