package MyBaseClass; sub open_for_reading_validation_spec { return { 'path' => 0, }; } sub open_for_reading { my ($this, $params_ref) = @_; $params_ref ||= {}; Params::Validate::validate($params_ref, $this->open_for_reading_validation_spec); return $this->do_open_for_reading($params_ref); } sub do_open_for_reading { my ($this, $params_ref) = @_; return $this->get_context('path' => $params_ref->{'path'} || $this->path); } package MyDerivedClass; use base qw(MyBaseClass); sub do_open_for_reading { my ($this, $params_ref) = @_; my $context = $this->SUPER::do_open_for_reading($params_ref); if ($params_ref->{'join_longcalls'}){ ... modify context } return $context; } sub open_for_reading_validation_spec { my ($this) = @_; return { %{$this->SUPER::open_for_reading_validation_spec}, 'join_longcalls' => 0, }; }