Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Getting constructor caller in Mo/Moo/Moose BUILD/BUILDARGS

by perlancar (Hermit)
on Jul 25, 2015 at 11:58 UTC ( [id://1136281]=perlquestion: print w/replies, xml ) Need Help??

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

    Carp does something similar (with the idea that when you provide a module that someone uses incorrectly, you want to tell that person where their mistake is, rather than about the internals of your module). So you may want to look there. After a quick look the sub short_error_loc may be the one that does what you want, as it iterates through callers until it finds a package that isn't "trusted" (parent packages, packages in the trust list, and packages trusted by those ones).

Re: Getting constructor caller in Mo/Moo/Moose BUILD/BUILDARGS
by perlancar (Hermit) on Jul 26, 2015 at 10:41 UTC

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1136281]
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others pondering the Monastery: (3)
As of 2024-04-20 07:53 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found