in reply to OO - problem with inheritance

You could use a method instead of variable to store information about parameters. This way this information could be overridden easily in subclasses:
my $parameter_config = { mandatory => {type => 'boolean', default => 0, valid => 0}, }; sub parameter_config { $parameter_config }; sub valid_parameter { my $class = shift; my @param = @_; foreach (@param) { my $param_config = $class->parameter_config->{$_}; if ($param_config) { $param_config->{valid} = 1; } else { die "Parameter $_ not known"; } } return 1; }
And in your classes you should call valid_parameter as method:
Integer->valid_parameter(qw(mandatory));
Subclasses which need other configuration of parameters just override method parameter_config.

--
Ilya Martynov (http://martynov.org/)

Replies are listed 'Best First'.
Re: Re: OO - problem with inheritance
by uwevoelker (Pilgrim) on Jan 14, 2002 at 20:30 UTC
    Hello Ilya,
    thank you for your fast answer. Did I got you right, that when I want to change other configuration parameters like this
    &CCS::Data::Datatype::base_class::config_parameter( max_length => {max => 255, default => 255}, min_length => {max => 255});
    which is taken from my String class, I need to override your sub parameter_config in this way?
    sub parameter_config { return {max_length => {max => 255, default =>255)); }
    But I also need the other parameters from base class (like min => 0 and valid => 0 in this case).

    Or could I do something like this:
    my $parameter_config = SUPER->parameter_config; $parameter_config->{max_length}{max} = 255; $parameter_config->{max_length}{default} = 255; sub parameter_config { $parameter_config }
    My classes not only inherit from base_class.pm. There are also datatypes that inherit from other datatypes. Such as Text inherits from String (but no direct base_class) and PrimaryKey inherits from Integer. Is such inheritance with one of this configuration methods combineable?

    My goal is, that I can add new parameters only in base_class (let's say has_double_letters or max_number / min_number) and all the datatypes need only to "activate" this new parameters via the ->valid_parameter(qw(mandatory max_number)) call.

    Thanks, Uwe
      my $parameter_config = __PACKAGE__->SUPER::parameter_config; $parameter_config->{max_length}{max} = 255; $parameter_config->{max_length}{default} = 255; sub parameter_config { $parameter_config }
      This should work if you want to register your parameters in base_class. BTW you don't need to override parameter_config at all in this case because SUPER->parameter_config returns hash reference stored in $parameter_config variable in base class. So next two lines do affect hash used by base_class. If it is not desired effect you should clone that hash:
      use Storable qw(dclone); my $parameter_config = dclone(__PACKAGE__->SUPER::parameter_config); $parameter_config->{max_length}{max} = 255; $parameter_config->{max_length}{default} = 255; sub parameter_config { $parameter_config }
      Update: Fixed usage of wrong syntax (SUPER->method instead of __PACKAGE__->SUPER::method)

      --
      Ilya Martynov (http://martynov.org/)

        The hash would need to be cloned. But I have an other idea - see my other posting titled "new idea - please comment on this".
        Thanks.
        Hello Ilya,
        I need your help. I have written an Parameter::Validate module. And now I would like to use it as you said.
        use strict; use lib '/home/uwe/cvs/perl'; use lib '/home/uwe/cvs/perl/module'; use Parameter::Validate; use base 'CCS::Data::Datatype::base_class'; # parameter configuration #my $pv = CCS::Data::Datatype::base_class->pv->clone; my $pv = SUPER->pv->clone; $pv->enable(qw(mandatory min_length max_length)); $pv->change(max_length => {max => 255, default => 255}, min_length => {max => 255}); sub pv { $pv; }
        If I use the full qualified parent class name (CCS::Data::Datatype::base_class->pv) everything works like expected. But if I use the line with SUPER->pv I get an error: Can't locate object method "pv" via package "SUPER" (perhaps you forgot to load "SUPER"?) at /home/uwe/cvs/perl/CCS/Data/Datatype/String.pm line 16.
        So, what is wrong with SUPER?

        Thank you, Uwe