Sub-Pipeline

 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 distribution
 view release on metacpan -  search on metacpan

( run in 0.379 second using v1.00-cache-2.02-grep-82fe00e-cpan-9e6bc14194b )