or download this
my $source = Sub::ParamObject->new({
selector => [ qr/^(filename|url)$/, sub { @{$_[0]}{qw(filename url
+)} and !exists $self->{$_[1]} }, ],
filename => [ qr/^\w+$/, sub { !exists $_[0]->{filename} or $_[0]-
+>{selector} eq 'url' }, ],
url => [ qr!^https?://!i, sub { !exists $_[0]->{filename} or $_[0]
+->{selector} eq 'url' }, ],
});