Moose with role already attached
July 25, 2009
OK so adding Singleton Method to you class is nice and easy with:
use Moose; with 'MooseX::SingletonMethod';
But wouldn’t it be even nicer if you could replace the two lines with something like:
use MyMoose;
Well you can by applying the role to the base object (Moose::Object) like so:
package MyMoose; use Moose (); use Moose::Exporter; use Moose::Util::MetaRole; Moose::Exporter->setup_import_methods( also => 'Moose' ); sub init_meta { shift; my %options = @_; my $meta = Moose->init_meta( %options ); Moose::Util::MetaRole::apply_base_class_roles( for_class => $options{ for_class }, roles => [ 'MooseX::SingletonMethod' ], # <= my roles ); return $meta; } 1;
And then we can create Moose class and use it like so:
package Baz; use MyMoose; has 'name' => ( is => 'rw', isa => 'Str' ); package main; my $baz = Baz->new( name => 'baz' ); $baz->add_singleton_method( hello => sub { 'hello ' . $_[0]->name } ); say $baz->hello; # => 'hello baz'
Of course you don’t need to stop with just adding MooseX::SingletonMethod role only… add all your favourite roles in there!
For more info see Moose::Cookbook::Extending::Recipe2
/I3az/
3 Comments
leave one →
Really useful and clear! Thanks. I wonder how this works with MooseX::Declare….
Thanks John.
Re: MooseX::Declare… Yes I wonder how this would work to π
Getting into Devel::Declare is on my (long!) list of things todo. I guess we need to be able to tell MX::Declare to use a different base class which could look like this?….
use MooseX::Declare (base_class => ‘MyMoose’);
/I3az/