Mostly it makes it difficult to catch errors if those methods fail.
But not any more difficult that catching an error in *any* chaining call. The OP had no problem with:but if there's an error in the child method, it'll be as hard to catch as in:my $label_formatting = $button->child->font_style;
$window->title('foo')->border(20);
And if your methods just throw exceptions on errors, you can just wrap it all in an eval:
If that isn't good enough for you, because you need fine grained control on catching errors, you can always write:eval {$window->title('foo')->border(20)}; if ($@) {...do something...}
The point is that mutators returning $self allow for either style. Chaining for those who want it, and fine control for those who want that.eval {$window->title('foo')}; if ($@) {....} else {eval {$window->border(20)} if ($@) {....}}
Returning the argument passed in is IMO not very useful. The OP mentioned "that's how = does it - it allows you to write $foo = $bar = $baz;. That's true, but the OO equivalent would be:
which, IMO, gets unwieldy very quickly and isn't very readable either. I also have seldomly any use for that.$obj->foo($obj->bar($baz))
In reply to Re^4: Mutator chaining considered harmful
by Anonymous Monk
in thread Mutator chaining considered harmful
by Aristotle
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |