Re: Question about creating objects using Moose::Meta::Class
[email protected] (Stevan Little)
| Newsgroups | perl.moose |
|---|---|
| Message-ID | <[email protected]> |
Tom,
The new_object method on the metaclass does not call BUILD, this is
only called by Moose::Object::new, and more specifically
Moose::Object::BUILDALL. The BUILD initialization feature is a part
of Moose::Object and not the underlying MOP.
The thinking is that the division of responsibility should function
like this:
- The class is responsible for the creation of object instances.
- The base object is responsible for the object initialization.
By doing this it makes it much easier for the end user to override
(or just exert finer control over) object initialization features
with simple subclassing, rather then requiring any MOP diving.
Basically, your suspicions about what purpose Moose::Meta::Class
serves are correct though, it exists to build classes with and then
to later alter those classes.
- Stevan
On Aug 27, 2008, at 9:11 PM, Bald Man Tom wrote:
> Greetings. I was leafing through the Moose documentation the other
> day when I stumbled across Moose::Meta::Class. If I understand
> correctly, one of the things I can do with this module is create
> metaclasses, then use those to create new objects. However, when I
> do so, the BUILD subs don't seem to be called in the same way as
> when I create objects from "traditional" Moose classes:
>
> Consider this bogus example:
>
> ---
>
> #! perl
>
> use strict;
> use warnings;
>
> package My::Class;
> use Moose;
>
> sub BUILD { print "BUILD for My::Class\n"; }
>
> package My::SubClass;
>
> use Moose;
> extends 'My::Class';
> sub BUILD { print "BUILD for My::SubClass\n"; }
>
> package main;
>
> use Moose::Meta::Class;
>
> my $mc = Moose::Meta::Class->create( 'My::MetaSubClass',
> superclasses => [ 'My::Class' ],
> methods => {
> BUILD => sub { print "BUILD for My::MetaSubClass\n"; },
> },
> );
>
> print "Creating a new object from the metaclass\n";
> my $obj_from_metaclass = $mc->new_object();
> print "Creation complete\n";
>
> print "\nCreating a new object from the My::SubClass\n";
> my $obj_from_subclass = My::SubClass->new();
> print "Creation complete\n";
>
> ---
>
> When I run this, I get the following output:
>
> ---
>
> Creating a new object from the metaclass
> Creation complete
>
> Creating a new object from the My::SubClass
> BUILD for My::Class
> BUILD for My::SubClass
> Creation complete
>
>
> ---
>
> I would have expected the BUILD subs for My::Class and
> My::MetaSubClass to have been called when I called $mc->new_object
> (). Of course, I can do this manually by using $obj_from_metaclass-
> >BUILDALL().
>
> Is my expectation of the BUILD subs being run unfounded? Or, more
> likely, am I completely misunderstanding the intent of
> Moose::Meta::Class in the first place?
>
> Thanks!
> Tom