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' ], ); #### 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(); #### 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; } @_; }