- Used feedback from MSCHWERN / Bug #22074 to cleanup new/_pre_submit more
[Business-OnlinePayment.git] / OnlinePayment.pm
index 871d555..3f95cd1 100644 (file)
@@ -3,13 +3,15 @@ package Business::OnlinePayment;
 use strict;
 use vars qw($VERSION);
 use Carp;
-use Symbol;
 
 require 5.005;
 
 $VERSION = '3.00_04';
 $VERSION = eval $VERSION; # modperlstyle: convert the string into a number
 
+# Remember subclasses we have "wrapped" submit() with _pre_submit()
+my %Presubmit_Added = ();
+
 my %fields = (
     authorization    => undef,
     error_message    => undef,
@@ -27,7 +29,6 @@ my %fields = (
     transaction_type => undef,
 );
 
-
 sub new {
     my($class,$processor,%data) = @_;
 
@@ -54,15 +55,17 @@ sub new {
         $self->$key($value);
     }
 
-    {
-       no strict 'refs';
+    # "wrap" submit with _pre_submit only once
+    unless ( $Presubmit_Added{$subclass} ) {
+        my $real_submit = $subclass->can('submit');
+
        no warnings 'redefine';
-       my $submit = qualify_to_ref('submit', $subclass);
-       $self->{_child_submit} = \&$submit;
+       no strict 'refs';
+
        *{"${subclass}::submit"} = sub {
            my $self = shift;
-           $self->_pre_submit();
-
+           return unless $self->_pre_submit(@_);
+           return $real_submit->($self, @_);
        }
     }
 
@@ -78,7 +81,7 @@ sub _risk_detect {
     $risk_transaction->submit();
     if ($risk_transaction->is_success()) {
        if ( $risk_transaction->fraud_score <= $self->maximum_fraud_score()) {
-           $self->{_child_submit}->($self);
+           return 1;
        } else {
            $self->is_success(0);
            $self->error_message('Excessive risk from risk management');
@@ -89,12 +92,12 @@ sub _risk_detect {
     }
 }
 
-sub _pre_submit{
+sub _pre_submit {
     my ($self) = @_;
     my $fraud_detection = $self->fraud_detect();
 
     # early return if user does not want optional risk mgt
-    return $self->{_child_submit}->($self,@_) unless $fraud_detection && length $fraud_detection;
+    return 1 unless $fraud_detection;
 
     # Search for an appropriate FD module
     foreach my $subclass ( q(Business::OnlinePayment::) . $fraud_detection,
@@ -116,7 +119,7 @@ sub _pre_submit{
            }
        }
     }
-};
+}
 
 sub content {
     my($self,%params) = @_;
@@ -213,9 +216,9 @@ Business::OnlinePayment - Perl extension for online payment processing
   $transaction->submit();
   
   if($transaction->is_success()) {
-    print "Card processed successfully: ".$transaction->authorization()."\n";
+    print "Card processed successfully: ", $transaction->authorization(), "\n";
   } else {
-    print "Card was rejected: ".$transaction->error_message()."\n";
+    print "Card was rejected: ", $transaction->error_message(), "\n";
   }
 
 =head1 DESCRIPTION
@@ -328,7 +331,7 @@ Customer's email address.
 Credit card number (obviously not required for non-credit card
 transactions).
 
-=item * exp_date
+=item * expiration
 
 Credit card expiration (obviously not required for non-credit card
 transactions).