What is the proper way to get the caller to our object creation (the object's client code) inside Mo/Moo/Moose's BUILD or BUILDARGS? I'm okay with getting a subclass.
From a quick glance of the Moo and Moose codebase, it doesn't seem like Moo/Moose provides a utility routine for this. A quick search on CPAN also doesn't yield anything yet.
Example:
package Class1;
use Moo;
has attr1 => (is => 'rw');
sub BUILD {
no strict 'refs';
my $self = shift;
# XXX set default for attr1 depending on the caller
unless (defined $self->attr1) {
$self->attr1(${"$object_caller_package\::FOO"});
}
}
package C2;
use Moo;
extends 'C1';
package main;
our $FOO = 42;
say C2->new->attr1; # prints 42
In principle it should be easy enough to loop over the caller stack and use the first non-Moo* stuff.