Data-Pipeline

 view release on metacpan or  search on metacpan

lib/Data/Pipeline/Machine.pm  view on Meta::CPAN

package Data::Pipeline::Machine;

use Moose;
use Sub::Exporter;
use Sub::Name 'subname';
use Class::MOP ();
use Carp ();

use namespace::autoclean;
            
#use Data::Pipeline::Aggregator::Machine;
use Data::Pipeline::Machine::Surrogate;
use Data::Pipeline::Iterator::Options;

use MooseX::Types::Moose qw(HashRef);  

use Data::Pipeline::Types qw(Iterator IteratorSource Aggregator IteratorOutput);
                        
BEGIN {
    Class::MOP::load_class('Data::Pipeline::Aggregator::Machine');
    Class::MOP::load_class('Data::Pipeline::Aggregator::Pipeline');
}

has _m => (
    isa => 'Object',
    is => 'rw',
    lazy => 1,
    default => sub {
        _machine( $_[0] -> meta -> name )
    },
    handles => [qw( from transform )]
);

{
my %machines;
sub _machine {
    my($class) = @_;

    $machines{$class} ||= Data::Pipeline::Aggregator::Machine -> new( );
}
}

sub import {
    my($own_class) = @_;
        
    my $CALLER = caller();

    # see Moose.pm for explanation :-)
    strict->import;
    warnings->import;

    return if $CALLER eq 'main';

    my $machine = _machine($CALLER);

    my %exports;


#    $exports{connect} = sub {
#        my $class = $CALLER;
#        my $machine = _machine($class);
#        return subname "Data::Pipeline::Machine::connect" => sub {
#            my($from, $to);
#            while( ($from, $to) = splice @_, 2) {
#                $machine -> connect($from, $to);
#            }
#        };
#    };

    $exports{pipeline} = sub {
        subname "Data::Pipeline::Machine::pipeline" => sub {
            my $n;
            if(ref $_[0]) {
                $n = 'finally';
            }
            else {
                $n = shift;
            }
            if( @_ > 1 ) {
                $machine -> add_pipeline($n => [ @_ ]);
            }
            else {
                $machine -> add_pipeline($n =>  @_ );
            }
        };
    };

    # initial caps because this is used as if it were an action
    $exports{Option} = sub {
        my $class = $CALLER;
        my $machine = _machine($class);
        return subname "Data::Pipeline::Machine::Option" => sub {
            my($name, %options) = @_;
            return Data::Pipeline::Iterator -> new( coded_source => sub {
                #print STDERR caller(), "\n";
                #print STDERR "$machine -> Option( $name )\n";
                #print STDERR "has option\n" if Data::Pipeline::Machine::has_option($name);
                #print STDERR "options available: ", join(", ", keys %Data::Pipeline::Macine::current_options), "\n";
		#print STDERR "$name => ", Data::Pipeline::Machine::get_option($name), "\n";
                to_IteratorSource( Data::Pipeline::Machine::has_option($name) ?
                    Data::Pipeline::Machine::get_option($name) :
                    $options{default}
                );
            } )
            ;
        };
    };

    $exports{Pipeline} = sub {



( run in 2.043 seconds using v1.01-cache-2.11-cpan-ceb78f64989 )