my $source = Sub::ParamObject->new(test => { selector => { value => qr/^(filename|url)$/, }, filename => { value => qr/^\w+$/, }, url => { value => qr!^https?://!i, }, }, if_valid => { selector => sub { $_[0]->add_check($_[1] eq 'url' ? 'filename' : 'url', forbidden => sub { return }); }, filename => sub { $_[0]->add_check(selector => need_filename => sub { $_[1] ne 'url' }); }, url => sub { $_[0]->add_check(selector => need_url => sub { $_[1] ne 'filename' }); }, });