You seem to be missing something that I've seen in every other implementation of this: something to make the result false when a method is no longer being called on it, via overload.
So that:
my $obj = Foo::->new->set_bar("iron")->inc_baz(1000)
or die "something in there went horribly wrong: ", $obj->errmsg;
$obj or die "something in there went horribly wrong: ", $obj->errmsg;
(Updated to fix nit picked by ihb)
can trigger the error clause. But I'm not a big fan of this
method of working anyway; when I've had to chain lots of methods (usually only when using B), I just wrap the whole chain in an eval block.