Definitely agree having modules use SUPER would be cleaner/safer/better.
Ivan, we should consider this idea very seriously.
- Now always wrap submit() method with _pre_submit() (but only once)
- no longer populate _child_submit, code in anon sub was cleaned up
- use return values from _pre_submit to determine if real submit is called
the return values from _pre_submit should be reviewed/verified still
use strict;
use vars qw($VERSION);
use Carp;
use strict;
use vars qw($VERSION);
use Carp;
$VERSION = eval $VERSION; # modperlstyle: convert the string into a number
# Remember subclasses we have "wrapped" submit() with _pre_submit()
$VERSION = eval $VERSION; # modperlstyle: convert the string into a number
# Remember subclasses we have "wrapped" submit() with _pre_submit()
-my %WrappedSubmitClassMethod = ();
+my %Presubmit_Added = ();
my %fields = (
authorization => undef,
my %fields = (
authorization => undef,
- unless ( $subclass->can('submit') eq $class->can('submit') ) {
- my $submit = qualify_to_ref('submit', $subclass);
+ # "wrap" submit with _pre_submit only once
+ unless ( $Presubmit_Added{$subclass} ) {
+ my $real_submit = $subclass->can('submit');
- # "wrap" submit ONLY once, cache info for later calls to new()
- if ( ! exists $WrappedSubmitClassMethod{$subclass} ) {
- no warnings 'redefine';
- no strict 'refs';
+ no warnings 'redefine';
+ no strict 'refs';
- $WrappedSubmitClassMethod{$subclass} = \&$submit;
- *{"${subclass}::submit"} = sub {
- my $self = shift;
- $self->_pre_submit();
- }
+ *{"${subclass}::submit"} = sub {
+ my $self = shift;
+ return unless $self->_pre_submit(@_);
+ return $real_submit->($self, @_);
- $self->{_child_submit} = $WrappedSubmitClassMethod{$subclass};
$risk_transaction->submit();
if ($risk_transaction->is_success()) {
if ( $risk_transaction->fraud_score <= $self->maximum_fraud_score()) {
$risk_transaction->submit();
if ($risk_transaction->is_success()) {
if ( $risk_transaction->fraud_score <= $self->maximum_fraud_score()) {
- $self->{_child_submit}->($self);
} else {
$self->is_success(0);
$self->error_message('Excessive risk from risk management');
} else {
$self->is_success(0);
$self->error_message('Excessive risk from risk management');
my $fraud_detection = $self->fraud_detect();
# early return if user does not want optional risk mgt
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,
# Search for an appropriate FD module
foreach my $subclass ( q(Business::OnlinePayment::) . $fraud_detection,
sub content {
my($self,%params) = @_;
sub content {
my($self,%params) = @_;