+sub _risk_detect {
+ my ($self, $risk_transaction) = @_;
+
+ my %parent_content = $self->content();
+ $parent_content{action} = 'Fraud Detect';
+ $risk_transaction->content( %parent_content );
+ $risk_transaction->submit();
+ if ($risk_transaction->is_success()) {
+ $self->fraud_score( $risk_transaction->fraud_score );
+ $self->fraud_transaction_id( $risk_transaction->fraud_transaction_id );
+ if ( $risk_transaction->fraud_score <= $self->maximum_fraud_score()) {
+ return 1;
+ } else {
+ $self->error_message('Excessive risk from risk management');
+ }
+ } else {
+ $self->error_message('Error in risk detection stage: ' . $risk_transaction->error_message);
+ }
+ $self->is_success(0);
+ return 0;
+}
+
+my @Fraud_Class_Path = qw(Business::OnlinePayment Business::FraudDetect);
+
+sub _pre_submit {
+ my ($self) = @_;
+ my $fraud_detection = $self->fraud_detect();
+
+ # early return if user does not want optional risk mgt
+ return 1 unless $fraud_detection;
+
+ # Search for an appropriate FD module
+ foreach my $fraud_class ( @Fraud_Class_Path ) {
+ my $subclass = $fraud_class . "::" . $fraud_detection;
+ eval "use $subclass ()";
+ if ($@) {
+ croak("error loading fraud_detection module ($@)")
+ unless ( $@ =~ m/^Can\'t locate/ );
+ } else {
+ my $risk_tx = bless( { processor => $fraud_detection }, $subclass );
+ $risk_tx->build_subs(@methods);
+ if ($risk_tx->can('set_defaults')) {
+ $risk_tx->set_defaults();
+ }
+ $risk_tx->_glean_parameters_from_parent($self);
+ return $self->_risk_detect($risk_tx);
+ }
+ }
+ croak("Unable to locate fraud_detection module $fraud_detection"
+ . " in \@INC under Fraud_Class_Path (\@Fraud_Class_Path"
+ . " contains: @Fraud_Class_Path) (\@INC contains: @INC)");
+}
+