On Thu, 14 Feb 2013, Bill Moseley wrote:
Hi all,I had a problem that I tracked down to BUILD getting run twice. It turned out a subclass was (incorrectly) using "after 'BUILD'". When that happens the BUILD in the base class runs twice. I realize it's an improper use of BUILD but just wanted to note it in case it's not an expected behavior. package baseclass; use Moose; sub BUILD { warn "in baseclass BUILD\n" } package subclass; use Moose; extends 'baseclass'; # WRONG usage after 'BUILD' => sub { warn "in bad subclass BUILD\n" }; package main; subclass->new; 1; Results in: in baseclass BUILD in baseclass BUILD in bad subclass BUILD
This is definitely a bug but it might be tricky to fix. Basically, method modifiers effectively copy the modified sub into the class that has the modifier. Moose then sees a BUILD in the subclass and baseclass and dutifully calls both.
But as you point out, what you did is just wrong anyway. The whole point of BUILD is that defining it in subclasses doesn't hide the parent's implementation.
The only time you need modifiers on BUILD is when you want a role to modify BUILD.
-dave /*============================================================ http://VegGuide.org http://blog.urth.org Your guide to all that's veg House Absolute(ly Pointless) ============================================================*/
