Data::Conveyor::Stage::TxSelector - Stage-based conveyor-belt-like ticket handling system


Data-Conveyor documentation Contained in the Data-Conveyor distribution.

Index


Code Index:

NAME

Top

Data::Conveyor::Stage::TxSelector - Stage-based conveyor-belt-like ticket handling system

VERSION

Top

version 1.103130

METHODS

Top

DEFAULTS

FIXME

after_object_type_iteration

FIXME

before_object_type_iteration

FIXME

calc_explicit_tx

FIXME

calc_implicit_tx

FIXME

main

FIXME

object_type_iteration_order

FIXME

INSTALLATION

Top

See perlmodinstall for information and options on installing Perl modules.

BUGS AND LIMITATIONS

Top

No bugs have been reported.

Please report any bugs or feature requests through the web interface at http://rt.cpan.org/Public/Dist/Display.html?Name=Data-Conveyor.

AVAILABILITY

Top

The latest version of this module is available from the Comprehensive Perl Archive Network (CPAN). Visit http://www.perl.com/CPAN/ to find a CPAN site near you, or see http://search.cpan.org/dist/Data-Conveyor/.

The development version lives at http://github.com/hanekomu/Data-Conveyor and may be cloned from git://github.com/hanekomu/Data-Conveyor. Instead of sending patches, please fork this project using the standard git and github infrastructure.

AUTHORS

Top

COPYRIGHT AND LICENSE

Top


Data-Conveyor documentation Contained in the Data-Conveyor distribution.

use 5.008;
use strict;
use warnings;

package Data::Conveyor::Stage::TxSelector;
BEGIN {
  $Data::Conveyor::Stage::TxSelector::VERSION = '1.103130';
}
# ABSTRACT: Stage-based conveyor-belt-like ticket handling system

# Implements the transaction selector (txsel)
use Error::Hierarchy::Util 'assert_defined';
use parent 'Data::Conveyor::Stage::SingleTicket';

sub DEFAULTS {
    (expected_stage => $_[0]->delegate->ST_TXSEL);
}

# Return a list of object types that specifies in which order payload items
# should be traversed. Subclasses might need to override this with a specific
# order, for example, when new payload items are created implicitly.
#
# don't include transaction itself in calculating transactions
sub object_type_iteration_order {
    grep { $_ ne $_[0]->delegate->OT_TRANSACTION } $_[0]->delegate->OT;
}

sub main {
    my ($self, %args) = @_;
    $self->SUPER::main(%args);

    # Txsel handlers can create implicit payload items; to ensure idempotency,
    # we remove them before reprocessing the ticket.
    $self->ticket->payload->delete_implicit_items;
    $self->ticket->payload->transactions_clear;
    $self->before_object_type_iteration;
    for my $object_type ($self->object_type_iteration_order) {
        for my $payload_item (
            $self->ticket->payload->get_list_for_object_type($object_type)) {
            $self->calc_implicit_tx($object_type, $payload_item,
                $self->delegate->CTX_BEFORE);
            $self->calc_explicit_tx($object_type, $payload_item);
            $self->calc_implicit_tx($object_type, $payload_item,
                $self->delegate->CTX_AFTER);
        }
    }
    $self->after_object_type_iteration;
}

# Two events that subclasses might want to handle
sub before_object_type_iteration { }
sub after_object_type_iteration  { }

sub calc_explicit_tx {
    my ($self, $object_type, $payload_item) = @_;
    $self->ticket->payload->add_transaction(
        object_type  => $object_type,
        command      => $payload_item->command,
        type         => $self->delegate->TXT_EXPLICIT,
        status       => $self->delegate->TXS_RUNNING,
        payload_item => $payload_item,
        necessity    => $self->delegate->TXN_MANDATORY,
    );
}

# find and set implicit transactions in the current object.
sub calc_implicit_tx {
    my ($self, $object_type, $payload_item, $context) = @_;
    our $factory ||= $self->delegate->make_obj('transaction_factory');
    assert_defined $context,      'called without context.';
    assert_defined $object_type,  'called without object_type.';
    assert_defined $payload_item, 'called without payload item.';
    $factory->gen_txsel_handler(
        $object_type,
        $payload_item->{command},
        $context,
        payload_item => $payload_item,
        ticket       => $self->ticket,
    )->calc_implicit_tx;
}
1;


__END__