Create a Object oriented perl class quickly and easily, including get and set and clear methods, with a default values hash and an initialization hash. Object Oriented Perl by Damian Conway section 8.2 (pages 222-235) has a good treatment of this, but doesn't provide workable code. Below is the code to do this.
package Simple; use Class::MethodMaker get_set => [qw(a b)], new_with_init => 'new'; sub init { my $self = shift; my %in_args = @_; my %default_args = ( b => "default"); my %final_args = (%default_args, %in_args); foreach my $thiskey (keys(%final_args)) { $self->{$thiskey} = $final_args{$thiskey}; } return; } -------------- in use_it.pl --------- use Simple; my $test = new Simple (a=>1); # now a==1, b==default. my $test = new Simple (a=>1, b=>2); # now a==1, b==2.
  • Comment on Create small simple OO program with get/set, defaults, initialization
  • Download Code

Replies are listed 'Best First'.
Re: Create small simple OO program with get/set, defaults, initialization
by rob_au (Abbot) on Jul 03, 2002 at 06:24 UTC
    Another way to do it ...

    package Simple; use Class::MethodMaker get_set => [ qw/ a b / ], new_with_init => 'new'; sub init { my ($class, %args) = @_; my %default = ( 'b' => 'default' ); %args = (%args, %default); bless \%args, $class; }

    The difference here is that the arguments hash, %args, is blessed as an object rather than singularly creating each element as was being performed. Also too, this approach lends itself well to argument validation, for example with the addition of a single validation loop:

    use Carp; %args = (%args, %default); foreach (keys %args) { carp( 'Unknown argument to init subroutine - ', $_ ) unless exists + $default{$_}; } bless \%args, $class;

    This approach allows for the keys in the passed %args hash to be validated against the %default hash so that only allowed elements are included in the object.