...
This error occurs because the BEGIN block is evaluated at the beginning of runtime, before the @ISA statement can be evaluated. Therefore, when the Derived::new() constructor is invoked, the Derived class has an empty parents list and therefore fails to invoke Base::new().
Compliant Solution (
...
parent)
This compliant solution uses the base parent module rather than directly modifying the @ISA variable.
| Code Block | ||||
|---|---|---|---|---|
| ||||
# ... package Base is unchanged
{
package Derived;
use baseparent qw(Base);
sub new {
my $class = shift;
my $self = $class->SUPER::new(@_); # relies on established inheritence
print "new Derived\n";
return $self;
};
sub derived_value {return 2;}
}
# ... The rest of the code is unchanged
|
The base parent module establishes the inheritence hierarchy at parse time, before any runtime code, including the BEGIN block, is evaluated. Therefore, when the Derived::new() constructor is invoked, Perl knows that Derived is an instance of Base, and the program produces the correct output:
...
[Conway 05] pg. 360 "Inheritance"
[CPAN] Shank, Elliot, Perl-Critic-1.116 ClassHierarchies::ProhibitExplicitISA
[CPAN] DolanMaischein, ChrisMax. base parent
...