+$DEBUG = 0;
+
+sub request_id {
+ my $self = shift;
+ my $md5 = Digest::MD5->new();
+ $md5->add( $$, time(), rand(time) );
+ return $md5->hexdigest();
+}
+
+sub param {
+ my $self = shift;
+ my @args = @_;
+
+ $self->{__PARAM} ||= {};
+ my $param = $self->{__PARAM};
+
+ if (@args) {
+ if ( @args % 2 == 0 ) {
+ %$param = ( %$param, @args );
+ }
+ elsif ( @args == 1 ) {
+ my $arg = shift;
+ if ( ref($arg) eq "HASH" ) {
+ %$param = ( %$param, %$arg );
+ return keys %$arg;
+ }
+ else {
+ return $param->{$arg};
+ }
+ }
+ else {
+ croak("param: invalid arguments: @_\n");
+ }
+ }
+ else {
+ return ( keys %$param );
+ }
+}
+
+sub debug {
+ my $self = shift;
+
+ if (@_) {
+ my $level = shift || 0;
+ if ( ref($self) ) {
+ $self->{"__DEBUG"} = $level;
+ }
+ else {
+ $DEBUG = $level;
+ }
+ $Business::OnlinePayment::HTTPS::DEBUG = $level;
+ }
+ return ref($self) ? ( $self->{"__DEBUG"} || $DEBUG ) : $DEBUG;
+}
+
+sub _deprecate {
+ my $self = shift;
+ carp( "method '", __PACKAGE__, "::$_[0]' is deprecated" );
+ return $self->param(@_);
+}
+
+# NOTE: for bigger picture perhaps we get rid of build_subs() some day
+# and instead use something like param() as a standard method?
+
+# deprecated methods:
+sub cert_path { return shift->_deprecate( "cert_path", @_ ); }
+
+# custom methods:
+sub avs_code { return shift->param( "avs_code", @_ ); }
+sub cvv2_code { return shift->param( "cvv2_code", @_ ); }
+sub order_number { return shift->param( "order_number", @_ ); }
+sub partner { return shift->param( "partner", @_ ); }
+sub vendor { return shift->param( "vendor", @_ ); }