http://www.perlmonks.org?node_id=417405
Description:

This is an ongoing theme of mine: see multiple method calls against the same object (f.ex GUI programming) and RFC: Class::Proxy::MethodChain.

I think I have now found an elegant solution I can settle for.

An example similar to the one in multiple method calls against the same object (f.ex GUI programming) would be

my $window = call_on_obj( Gtk2::Window->new( "toplevel" ), [ signal_connect => ( delete_event => sub { Gtk2->main_quit } ) +], [ set_title => "Test" ], [ set_border_width => 15 ], [ add => call_on_obj( Gtk2::Button->new( "Quit" ), [ signal_connect => ( clicked => sub { Gtk2->main_quit } ) ], ) ], [ 'show_all' ], );

which is equivalent to

my $window = Gtk2::Window->new( "toplevel" ); $window->signal_connect( delete_event => sub { Gtk2->main_quit } ); $window->set_title( "Test" ); $window->set_border_width( 15 ); $window->add( do { my $button = Gtk2::Button->new( "Quit" ); $button->signal_connect( clicked => sub { Gtk2->main_quit } ); $button; } ); $window->show_all();

Update: changed example to actual working Gtk2 code.

Update: fixed re-throw code bug spotted by simonm.

use List::Util;

sub call_on_obj {
    my( $method, @param );
    no warnings 'once';
    List::Util::reduce {
        ( $method, @param ) = @$b;
        eval { $a->$method( @param ) };
        if( $@ ) { { local $@; require Carp; } Carp::croak( $@ ) }
        $a;
    } @_;
}