perlancar has asked for the wisdom of the Perl Monks concerning the following question:
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.
|
---|
Replies are listed 'Best First'. | |
---|---|
Re: Getting constructor caller in Mo/Moo/Moose BUILD/BUILDARGS
by Eily (Monsignor) on Jul 25, 2015 at 13:18 UTC | |
Re: Getting constructor caller in Mo/Moo/Moose BUILD/BUILDARGS
by perlancar (Hermit) on Jul 26, 2015 at 10:41 UTC |
Back to
Seekers of Perl Wisdom