But I suppose you don't want the sub missing() to be available as method the way ->foo() is?
That doesn't harm at all.
Calling $obj->missing just returns false, which is correct :-)
However, your objection discovered a flaw in my approach.
The missing sub needs to be prototyped to go one step further: multiple optional arguments.
And then slurping starts hurting :-)
This leads to:
#!/usr/bin/perl
use v5.16;
use warnings FATAL => 'all';
package Foo;
use experimental 'signatures';
use constant MISSING => bless {}, __PACKAGE__ . '::__missing__';
sub missing :prototype(;$) {
@_ ? $_[0] && $_[0] eq MISSING : MISSING;
}
sub new ($class) {
bless {}, $class;
}
sub foo ($self, $foo=missing, $bar=missing) {
say "foo is missing" if missing $foo;
say "bar is missing" if missing $bar;
}
package main;
my $foo = Foo->new;
say "none:";
$foo->foo;
say "one:";
$foo->foo(1);
say "two:";
$foo->foo(1, 2);
print "\n";
say 'object foo is not missing' unless $foo->missing;
__DATA__
none:
foo is missing
bar is missing
one:
bar is missing
two:
object foo is not missing
Greetings,
-jo
$gryYup$d0ylprbpriprrYpkJl2xyl~rzg??P~5lp2hyl0p$