The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Business::CyberSource::Request::Role::CreditCardInfo;
use strict;
use warnings;
use namespace::autoclean;

our $VERSION = '0.006009'; # VERSION

use Moose::Role;
use MooseX::RemoteHelper;

use MooseX::Types::CyberSource qw( Card);

use Class::Load qw( load_class );

our @CARP_NOT = ( 'Class::MOP::Method::Wrapped', __PACKAGE__ );

my %map = (
	cc_exp_month => 'month',
	cc_exp_year  => 'year',
	exp_month    => 'month',
	exp_year     => 'year',
	cvn          => 'security_code',
	csc          => 'security_code',
	cvv2         => 'security_code',
	cvc2         => 'security_code',
	cid          => 'security_code',
	credit_card  => 'account_number',
	card_type    => 'card_type_code',
);

around BUILDARGS => sub {
	my $orig = shift;
	my $self = shift;

	my $args = $self->$orig( @_ );

	return $args if defined $args->{card};

	load_class 'Carp';
	Carp::carp 'DEPRECATED: '
		. 'pass a Business::CyberSource::RequestPart::CreditCardInfo to '
		. 'purchase_totals '
		. 'or pass a constructor hashref to bill_to as it is coerced from '
		. 'hashref.'
		;

	my %newargs = map {(( $map{$_} || $_ ), $args->{$_})} keys %$args;

	my %cc_map = (
		account_number => 1,
		security_code  => 1,
	);

	my %ccexp_map = (
		month => 1,
		year  => 1,
	);

	my %card
		= map {
			defined $cc_map{$_} ? ( $_, delete $newargs{$_} ) : ()
		} keys %newargs;

	my %expiration
		= map {
			defined $ccexp_map{$_} ? ( $_, delete $newargs{$_} ) : ()
		} keys %newargs;

	$newargs{card           }  = \%card       if keys %card;
	$newargs{card}{expiration} = \%expiration if keys %expiration;

	return \%newargs;
};

before [ keys %map ] => sub {
	load_class('Carp');
	Carp::carp 'DEPRECATED: '
		. 'call attribute methods ( ' . join( ' ', keys %map ) . ' ) on '
		. 'Business::CyberSource::RequestPart::BillTo via bill_to directly'
		;
};

has card => (
	isa         => Card,
	remote_name => 'card',
	required    => 1,
	is          => 'ro',
	coerce      => 1,
	handles     => \%map,
);

1;

# ABSTRACT: credit card info role

__END__

=pod

=head1 NAME

Business::CyberSource::Request::Role::CreditCardInfo - credit card info role

=head1 VERSION

version 0.006009

=head1 ATTRIBUTES

=head2 card

L<Business::CyberSource::RequestPart::Card>

=head1 BUGS

Please report any bugs or feature requests on the bugtracker website
https://github.com/xenoterracide/Business-CyberSource/issues

When submitting a bug or request, please include a test-file or a
patch to an existing test-file that illustrates the bug or desired
feature.

=head1 AUTHOR

Caleb Cushing <xenoterracide@gmail.com>

=head1 COPYRIGHT AND LICENSE

This software is Copyright (c) 2012 by HostGator.com.

This is free software, licensed under:

  The Artistic License 2.0 (GPL Compatible)

=cut