Sub-Pipeline
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/Sub/Pipeline.pm view on Meta::CPAN
use strict;
use warnings;
package Sub::Pipeline;
{
$Sub::Pipeline::VERSION = '0.011';
}
# ABSTRACT: subs composed of sequential pieces
use Carp ();
use Params::Util 0.22 qw(_CODELIKE);
use Sub::Install;
sub new {
my ($class, $arg) = @_;
$arg->{on_success} ||= 'value';
my $self = bless {} => $class;
$self->order(@{ $arg->{order} }) if $arg->{order};
$self->pipe($_ => $arg->{pipe}{$_}) for (keys %{ $arg->{pipe} });
$self->on_success($arg->{on_success});
return $self;
}
sub order {
my $self = shift;
return @{ $self->{order} } unless @_;
$self->{order} = [ @_ ];
return @_;
}
sub pipe { ## no critic Homonym
my ($self, $name, $code) = @_;
return $self->{pipe}{$name} if @_ == 2;
Carp::croak "pipe piece must be a code reference" unless ref $code eq 'CODE';
$self->{pipe}{$name} = $code;
}
my %_behavior = map { $_ => 1 } qw(throw return value);
sub on_success {
my $self = shift;
return $self->{behavior} unless @_;
my ($behavior) = @_;
Carp::croak "invalid value for on_success" unless $_behavior{ $behavior };
$self->{behavior} = $behavior;
}
sub check {
my ($self) = @_;
for my $pipe ($self->order) {
my $code = $self->pipe($pipe);
unless ((ref $code eq 'CODE') or overload::Method($code, '&{}')) {
Sub::Pipeline::PipeMissing->throw(pipe => $pipe);
}
}
return 1;
}
sub _initial_state {
my ($self) = @_;
return {};
}
sub _call_parts {
my ($self, $order, $on_success, $get_part, $arg) = @_;
push @$arg, $self->_initial_state;
view all matches for this distributionview release on metacpan - search on metacpan
( run in 0.379 second using v1.00-cache-2.02-grep-82fe00e-cpan-9e6bc14194b )