The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Business::Payment::Processor;

use Moose::Role;
use Carp;

requires 'prepare_data';
requires 'request';

has 'charge_roles' => (
    is       => 'rw',
    isa      => 'ArrayRef[Str]',
    default  => sub { [] }
);

sub prepare_charge {
    my ( $self, $charge ) = @_;

    # TODO: This doesn't necessarily have to be here, there are roles that
    # are always required and roles that are sometimes required (for capture vs
    # a refund) per type.  A refund or void doesn't need all the roles
    if ( defined ( my $roles = $self->charge_roles ) ) {
        foreach my $role ( @$roles ) {
            unless ( $charge->meta->does_role( $role ) ) {
                my $ns = "Business::Payment::Charge";
                unless ( $role =~ /^$ns/ ) {
                    $role = join('::', $ns, $role);
                    if ( $charge->meta->does_role( $role ) ) {
                        next;
                    }
                }
                croak "Charge must have the role '$role' applied";
            }
        }
    }

}

sub handle {
    my ( $self, $charge ) = @_;

    $self->prepare_charge( $charge );

    my $data = $self->prepare_data( $charge );
    
    $self->prepare_result( $self->request( { }, $data ) );
}

sub prepare_result {
    my ( $self, $response ) = @_;
    return Business::Payment::Result->new(
        success         => 0,
        error_code      => -1,
        error_message   => 'No prepare_result method defined in processor'
    );
}


1;

=head1 NAME

Business::Payment::Processor - Role for all Processors

=head1 SYNOPSIS

    package My::Processor;
    
    use Moose;
    
    with 'Business::Payment::Processor';

    sub handle {
        die "Ain't got no money";
        return 1;
    }
    
    no Moose;
    __PACKAGE__->meta->make_immutable;

=head1 DESCRIPTION

Business::Payment::Processor is the base class from which all Processors
should inherit.

=head1 AUTHOR

Cory G Watson, C<< <gphat@cpan.org> >>

=head1 COPYRIGHT & LICENSE

Copyright 2009 Cold Hard Code, LLC, all rights reserved.

This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.