Hello,

I'm trying to utilize Class::MethodMaker for my open source shipping 
module (http://www.kavod.com/Business-Shipping).
 
I would like to extend it so that it will call SUPER in the methods 
generated by the MethodMaker "grouped_fields" configuration parameter.

I've built my own class that inherits from Class::MethodMaker, but when I 
try to get it to call SUPER::$method_name(), I get:

Can't locate auto/CustomMethodMaker/SUPER/required.al in @INC

(Where $method_name happened to be "required" at the time).

So, obviously, something isn't right.  I think it's because SUPER only works 
depending on the 'package' type, or something.

Here is what I did to the grouped_fields configuration parameter:

--- grouped_fields.orig 2003-07-05 14:37:06.000000000 -0700
+++ grouped_fields.new  2003-07-05 15:22:56.000000000 -0700
@@ -1,10 +1,21 @@
-sub grouped_fields {
+sub grouped_fields_inherit {
   my ($class, %args) = @_;
   my %methods;
   foreach (keys %args) {
     my @slots = @{$args{$_}};
     $class->get_set(@slots);
-    $methods{$_} = sub { @slots };
+
+       my $method_name = $_;
+       $methods{$_} = sub {
+               my $self = shift;
+               my @parent_slots = ();
+               @parent_slots = $self->SUPER::$method_name();
+               return ( @parent_slots, @slots );
+       };
+
   }
   $class->install_methods(%methods);
 }

I've tried to reduce all of the code down to the smallest example possible 
that still exhibits the problem, and pasted it below my sig.

I would greatly appreciate any comments.

Cheers,
-- 
Dan Browning, Kavod Technologies, <[EMAIL PROTECTED]> 360.843.4074x217
6700 NE 162nd Ave, Ste 611-210, Vancouver, WA.    Random Fortune:
Consultant, n.:
        An ordinary man a long way from home.


# Separate into four files: CustomMethodMaker.pm, Parent.pm, Child.pm, and 
# test.pl

############################################################################
## CustomMethodMaker.pm
############################################################################
package CustomMethodMaker;

use strict;
use warnings;

use base ( 'Class::MethodMaker' );

=head2 grouped_fields_inherit

Works like grouped_fields, except that it also calls the parent.  For
example:

grouped_fields => [
        required => [ 'r1', 'r2' ],
        optional => [ 'o1', 'o2' ]
];

$self->optional() results in $self->SUPER::optional(), then 
$self->optional().
=cut

# Slightly modified 'grouped_fields' function 
sub grouped_fields_inherit {
  my ($class, %args) = @_;
  my %methods;
  foreach (keys %args) {
    my @slots = @{$args{$_}};
    $class->get_set(@slots);
    
        my $method_name = $_;
        $methods{$_} = sub {
                my $self = shift;
                my @parent_slots = ();
                
                my $to_exec = "SUPER::$method_name";
                @parent_slots = $self->$to_exec();

                return ( @parent_slots, @slots );
        };
        
  }
  $class->install_methods(%methods);
}

1;

############################################################################
## TestParent.pm
############################################################################
package TestParent;

use CustomMethodMaker
        new_hash_init => 'new',
        grouped_fields_inherit => [
                required => [ 'parent_required_1', 'parent_required_2' ],
                optional => [ 'parent_optional_1', 'parent_optional_2' ]
        ];      
1;
############################################################################
## TestChild.pm
############################################################################
package TestChild;

use vars ( '@ISA' );
use TestParent;
@ISA = qw( TestParent );

use CustomMethodMaker
        new_hash_init => 'new',
        grouped_fields_inherit => [
                required => [ 'child_required_1', 'child_required_2' ],
                optional => [ 'child_optional_1', 'child_optional_2' ]
        ];
1;


#!/usr/bin/perl
#
############################################################################
## Test.pl
############################################################################
#
#
use strict;
use warnings;

use TestChild;

my $test_custom_method_maker = TestChild->new();

# Should print:
# "parent_required1, parent_required2, child_required1, child_required2 
print join( ', ', $test_custom_method_maker->required() ) . "\n";

# Should print:
# "parent_optional1, parent_optional2, child_optional1, child_optional2 
print join( ', ', $test_custom_method_maker->optional() ) . "\n";


if ( $test_custom_method_maker->can( "SUPER::required" ) ) {
        print "yes, it can execute SUPER::required()\n";
}

if ( $test_custom_method_maker->can( "SUPER::new" ) ) {
        print "yes, it can execute SUPER::new()\n";
}

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to