rkg has asked for the wisdom of the Perl Monks concerning the following question:


I'm using a home-rolled OO helper class. Its a simple subclass of Class::MethodMaker -- basically my subclass allows the naming of 'required' fields, and the constructor asserts if an object is created lacking a required field.

My question: if I have a class Foo (built with my OO helper class), is there a nice way to subclass it (creating "BigFoo"), keeping Foo setters and getters, and adding in some new "big" functionality and methods, allowing me to add functionality to the subclass with all the niceness of Class::MethodMaker? That is, can I subclass a C:MM class using something like C:MM, to get all those convenient helper construction methods?

Thanks for your advice --



Sorry my question was not clear.

I know I can subclass classes built with C:MM... I'd like to build those subclasses using C:MM:

package BigFoo; use base 'Foo'; # bogus code, just to give the idea use Class::MethodMaker subclassof => 'Foo', get_set => [ qw /BigFoo BigBaz/ ], list => [qw(BigList)];

Replies are listed 'Best First'.
Re: Class::Methodmaker inheritance
by qq (Hermit) on Mar 08, 2004 at 23:30 UTC

    It seems like your subclassing confusion got sorted out. Here is a snippet for 'required' arguments to constructors, using Class::MakeMethods. Check out the Examples about custom initialization for more ideas

    package Foo; use Class::MakeMethods::Template::Hash ( 'new --with_init' => 'new', scalar => 'foo', ); sub init { my $self = shift; my %args = @_; die 'I need foo!' unless $args{ foo }; $self->foo( $args{foo} ); }

    Basically the constructor hands off value initialization to an init method if asked to. It may be that Class::MethodMaker supports this kind of thing too - I'm not familiar with it.


Re: Class::Methodmaker inheritance
by Fletch (Bishop) on Mar 08, 2004 at 19:42 UTC

    The methods C::MM makes are no different than those you make yourself. If you're just extending with new methods there shouldn't be any problems so long as @ISA is correct. If you need to override the behavior of the parent class, you might want to use a has-a relationship instead and use C::MM's object slot type to forward on unchanged methods and then redefine whatever in the child class.

Re: Class::Methodmaker inheritance
by rkg (Hermit) on Mar 08, 2004 at 21:20 UTC
    The (obvious?) solution works -- very cool! Thanks, all.
    package Foo; use MakeMethods constructor => 'new', required => [qw(bar baz)], get_set =>[qw(bar baz)]; package BigFoo; use base 'Foo'; use MakeMethods get_set =>[qw(zonk zank)]; package main; use Data::Dumper; my $a = BigFoo->new(bar=>1, baz=>2, zonk=>3); print ref($a), "\n", $a->isa('Foo'), "\n"; print Dumper($a);
Re: Class::Methodmaker inheritance
by simonm (Vicar) on Mar 08, 2004 at 19:52 UTC
    Your question isn't entirely clear, but...

    Yes, you can use C::MM (or any subclass thereof), to add methods to your base class and then add other methods to your subclass.

      How? Can you post a snippet? (of using C:MM to add additional functionality to a subclass of a C:MM class)?Thanks!