On Thu, Feb 23, 2012 at 12:57:26PM +0700, Bill Moseley wrote:
> I often have classes that abstract out the work of fetching data from
> multiple sources -- so I have attributes that hold instances of the objects
> that do the actual work.   Each of these objects need their own config.
> 
> I've used three approaches to pass config to the contained objects, but
> each seems a bit cumbersome.  Just wondering if there's other ideas.
> 
> 
> One is to have a HashRef attribute in the "parent" that just gets passed to
> the "child" object's constructor.   This doesn't work so good if the class
> is turned into a command line tool.
> 
> I've also use a configuration class and pass an instance of that from the
> parent to the child.   Essentially the same as the hashref approach.

Whoa whoa whoa, stop right there. Have you seen MooseX::SimpleConfig and
MooseX::Getopt?  This is a very common design pattern in Moose:

    package MyChild;
    use Moose;
    with 'MooseX::Getopt', 'MooseX::SimpleConfig';

    has configfile => (
        is => 'ro', isa => 'Str',
        documentation => 'the configfile for MyChild',
        default => sub {
            my $class = shift;
            $class = blessed($class) || $class;
            return '/some/path/myclass_config.yml';
        },
    );

    has $_ => (
        is => 'ro', isa => 'Str',
    ) foreach @my_config_var_names;

    package Container;
    use Moose;

    has child => (
        is => 'ro', isa => 'MyChild',
        lazy => 1,
        default => sub {
            my $self = shift;
            MyChild->new_with_config(%otheroptions);
        },
        handles => {
            %delegations_here,
        },
    );


# usecase 1:  MyChild springs into existence on its first use, already
# pre-configured with values from myclass_config.yml.
    $container->child->somesub;

# usecase 2: use MyChild on its own, from a wrapper script.  @ARGV is
# automatically parsed via MooseX::Getopt and used as constructor args for
# MyChild. The config file is also parsed and used for any configs that
# aren't overridden from the command line.

    #/usr/bin/env perl
    use MyChild;
    my $child = MyChild->new_with_options;

    ./myscript --opt1 val1 --opt2 val2


Reply via email to