calldatacopy(ptr, 0, calldatasize)
let result := delegatecall(gas, _impl, ptr, calldatasize, 0, 0)
let size := returndatasize
returndatacopy(ptr, 0, size)
case 0 { revert(ptr, size) }
default { return(ptr, size) }
*https://blog.zeppelinos.org/proxy-patterns/