On Wed, Mar 25, 2009 at 12:08 AM, Sartak <[email protected]> wrote:
> The issue I'm running into is make_immutable. Within the
> MooseX::InstanceTracking role (to be applied to Moose::Meta::Class),
> there's no way to hook into the *inlined* constructor.
Dave Rolsky pointed out that I could use MetaRole to achieve the
functionality I need. "use MooseX::InstanceTracking" uses
Moose::Util::MetaRole to give the calling class a role, and its
constructor class a role. The ENTIRE implementation is provided at the
end of this mail.
It doesn't do exactly what I wanted (traits injecting more traits) but
it's good enough.
Shawn
package MooseX::InstanceTracking;
use strict;
use warnings;
use Moose::Exporter;
use MooseX::InstanceTracking::Role::Class;
Moose::Exporter->setup_import_methods();
sub init_meta {
shift;
my %p = @_;
Moose->init_meta(%p);
return Moose::Util::MetaRole::apply_metaclass_roles(
for_class => $p{for_class},
metaclass_roles => [ 'MooseX::InstanceTracking::Role::Class' ],
constructor_class_roles => [
'MooseX::InstanceTracking::Role::Constructor' ],
);
}