PropertyA triggers Event1(a), Event3(b) PropertyB # triggers no events PropertyC triggers Event3(c) ... #### Property Event 1 2 3 4 ... ======== =========== A a b B C c ... #### my $property_type_events = { Property::A => [ handler { Event::E1->new(@_) } 'a' , handler { Event::E3->new(@_) } 'b' ] Property::B => [ ], Property::C => [ handler { Event::E3->new(@_) } 'c' ], ... }; #### sub handler(&@) { my ($event_ctor, @args) = @_; return sub { my $event = $event_ctor->(@args); return $event->trigger(@_); }; } #### sub handle_widget_insertion_events($) { my ($widget) = @_; for my $property ($widget->get_properties) { my $handlers = $property_type_events{ ref($property) }; next unless $handlers; for my $handler (@$handlers) { my $rc = $handler->( "pass trigger args here" ); # do something with result code $rc } } }