handle caching of anon classes better, when role/class params are used
[gitmo/Moose.git] / lib / Moose / Meta / Role / Application / ToInstance.pm
CommitLineData
fb1e11d5 1package Moose::Meta::Role::Application::ToInstance;
2
3use strict;
4use warnings;
5use metaclass;
6
9b28d20b 7use Scalar::Util 'blessed';
83dcb866 8use List::MoreUtils 'all';
fb1e11d5 9
d5f016af 10use base 'Moose::Meta::Role::Application';
1c9db35c 11
3a79f0e9 12__PACKAGE__->meta->add_attribute('rebless_params' => (
13 reader => 'rebless_params',
14 default => sub { {} }
15));
16
1c9db35c 17sub apply {
f315aab3 18 my ( $self, $role, $object, $args ) = @_;
53b4c697 19
20 my $obj_meta = Class::MOP::class_of($object) || 'Moose::Meta::Class';
21
22 # This is a special case to handle the case where the object's metaclass
23 # is a Class::MOP::Class, but _not_ a Moose::Meta::Class (for example,
24 # when applying a role to a Moose::Meta::Attribute object).
25 $obj_meta = 'Moose::Meta::Class'
26 unless $obj_meta->isa('Moose::Meta::Class');
27
28 my $class = $obj_meta->create_anon_class(
a687ab44 29 superclasses => [ blessed($object) ],
f315aab3 30 roles => [ $role, keys(%$args) ? ($args) : () ],
83dcb866 31 cache => (all { $_ eq '-alias' || $_ eq '-excludes' } keys %$args),
53b4c697 32 );
33
53b4c697 34 $class->rebless_instance( $object, %{ $self->rebless_params } );
1c9db35c 35}
fb1e11d5 36
371;
38
ad46f524 39# ABSTRACT: Compose a role into an instance
40
fb1e11d5 41__END__
42
43=pod
44
fb1e11d5 45=head1 DESCRIPTION
46
47=head2 METHODS
48
49=over 4
50
51=item B<new>
52
53=item B<meta>
54
1c9db35c 55=item B<apply>
56
3a79f0e9 57=item B<rebless_params>
58
fb1e11d5 59=back
60
61=head1 BUGS
62
d4048ef3 63See L<Moose/BUGS> for details on reporting bugs.
fb1e11d5 64
fb1e11d5 65=cut
66