Peter Haworth wrote:
> That *is* a logical weakening. Just because the inherited precondition is
> C<< x > 10 >>, doesn't mean that the weakened condition has to be of the form
> C<< x > 9 >> or any other value lower than 10. C<< a || b >> is weaker than
> C<< a >>
So what we are looking at is something like....
class Animal {
method eat($food) is abstract {
PRE { $food.isa(Edible); }
POST { !$stomach.empty; }
}
...
}
class Goat is Animal {
method eat($food) {
PRE { $food.isa(Can); }
my $chewedfood = $teeth.chew($food);
$stomach.add($chewefood);
$teeth.brush()
POST { $teeth.clean; }
}
...
}
class Teeth {
method brush {...};
method chew {
...
POST { .clean == false; }
}
}
my Animal $billy = new Goat;
$billy.eat(Banana.new()); # succeeds because PRE for Animal.eat is met
$billy.eat(Can.new()); # succeeds because PRE for Goat.eat is met
$billy.eat(Rock.new()); # Fails because neither PRE is met
class DirtyTeeth is Teeth {
method brush {};
...
}
$billy.teeth = DirtyTeeth.new();
$billy.eat(Banana.new()); # Fails because POST for Goat.eat is not met
etc.
>
>> Are there
>>other ways to do it, just to mull them over?
>
>