Right now, in solidity, there are two ways to check for a contract, via extcodesize or by checking if tx.origin == msg.sender.
tx.origin is going to be deprecated.
extcodesize does not work for contracts calling via their constructor.
This should be fixed. A clear way should be presented to check if an address is a contract OR an user, especially when “user wallets” will have actual code in them in the future.