+__PACKAGE__->build_subs(@methods);
+
+#fallback
+sub _info {
+ my $class = shift;
+ ( my $gw = $class ) =~ s/^Business::OnlinePayment:://;
+ {
+ 'info_compat' => '0.00',
+ 'gateway_name' => $gw,
+ 'module_notes' => "Module does not yet provide info.",
+ };
+}
+
+#allow classes to declare info in a flexible way, but return normalized info
+%_info_handler = (
+ 'supported_types' => sub {
+ my( $class, $v ) = @_;
+ my $types = ref($v) ? $v : defined($v) ? [ $v ] : [];
+ $types = { map { $_=>1 } @$types } if ref($types) eq 'ARRAY';
+ $types;
+ },
+ 'supported_actions' => sub {
+ my( $class, $v ) = @_;
+ return %$v if ref($v) eq 'HASH';
+ $v = [ $v ] unless ref($v);
+ my $types = $class->info('supported_types') || {};
+ ( map { $_ => $v } keys %$types );
+ },
+);
+
+sub info {
+ my $class = shift; #class or object
+ my $info = $class->_info;
+ if ( @_ ) {
+ my $key = shift;
+ exists($_info_handler{$key})
+ ? &{ $_info_handler{$key} }( $class, $info->{$key} )
+ : $info->{$key};
+ } else {
+ wantarray ? ( keys %$info ) : [ keys %$info ];
+ }
+}
+