okay, I am not sure why making sure that value always returns something suitable for addition is a big deal.
first of all, you should not try to modify value directly, you should ask $think to modify value for you
second if $thing know how to perform addition on value, $thing will comply
there are so many ways to know if $thing can perform addition on value
1. ask $thing if he is of a certain type
2. ask $thing if one of his ancestors is of a certain type
3. according to your liskov, ask $thing if one of his derivatives is of a certain type
4. duck typing, ask thing to perform the addition, if $thing knows how, $thing will return the addition value, else raise an error (or do nothing)
5. ask $thing if he can add stuff regardless of his, his ancestors or hi derivatives types.
The problem i see with duck typing, is making sure that thing is always in a consistent state, that no request can validate things state, when an error is raise thing should make sure to return to a consistent state, thats all!
Read More