App-PAIA

 view release on metacpan or  search on metacpan

lib/App/PAIA/Command.pm  view on Meta::CPAN


# TODO: move option handling to App::PAIA

# Implements lazy accessors just like Mo, Moo, Moose...
sub has {
    my ($name, %options) = @_;
    my $coerce  = $options{coerce} || sub { $_[0] };
    my $default = $options{default};
    no strict 'refs'; ## no critic 
    *{__PACKAGE__."::$name"} = sub {
        if (@_ > 1) {
            $_[0]->{$name} = $coerce->($_[1]);
        } elsif (!exists $_[0]->{$name} && $default) {
            $_[0]->{$name} = $coerce->($default->($_[0]));
        } else {
            $_[0]->{$name}
        }
    }
}

sub option {
    my ($self, $name) = @_;
    $self->app->global_options->{$name} # command line
        // $self->config->get($name)    # config file
        // $self->session->get($name); # session file
}

has config => ( 
    default => sub {
        App::PAIA::File->new(
            logger => $_[0]->logger,
            type   => 'config',
            file   => $_[0]->app->global_options->config,
        ) 
    }
);

has session => ( 
    default => sub { 
        App::PAIA::File->new(
            logger => $_[0]->logger,
            type   => 'session',
            file   => $_[0]->app->global_options->session,
        ) 
    }
);

has agent => (
    default => sub {
        App::PAIA::Agent->new(
            insecure => $_[0]->option('insecure'),
            logger   => $_[0]->logger,
            dumper   => $_[0]->dumper,
        );
    }
);

has logger => (
    default => sub {
        ($_[0]->app->global_options->verbose || $_[0]->app->global_options->debug)
            ? sub { say "# $_" for split "\n", $_[0]; }
            : sub { };
    }
);

has dumper => (
    default => sub {
        $_[0]->app->global_options->debug
            ? sub { say "> $_" for split "\n", $_[0]; }
            : sub { };
    }
);

sub base_url {
    my ($self, $name) = @_;
   
    # command line
    if ( defined $self->app->global_options->{$name} ) {
        return $self->app->global_options->{$name}; 
    }

    my $base = $self->app->global_options->{base};
    if (defined $base) {
        $base =~ s{/$}{}; 
        return "$base/$name";
    }

    # session file or config file
    foreach ( $self->session, $self->config ) {
        if ( defined $_->get($name) ) {
            return $_->get($name);
        }
    }
    
    # config file with base
    if ( defined $self->config->get('base') ) {
        my $base = $self->config->get('base');
        $base =~ s{/$}{}; 
        return $base . "/$name";
    }

    return;
}

has auth => (
    default => sub {
        $_[0]->base_url('auth');
    }
);

has core => (
    default => sub {
        $_[0]->base_url('core');
    }
);

has base => (
    default => sub { $_[0]->option('base') },
    coerce  => sub { my ($b) = @_; $b =~ s!/$!!; $b; }
);

has patron => (
    default => sub { $_[0]->option('patron') }
);

has scope => (
    default => sub { $_[0]->option('scope') }
);



( run in 0.832 second using v1.01-cache-2.11-cpan-5c0b1e786e0 )