use Scalar::Util 'blessed';
use Class::MOP 0.60;
-our $VERSION = '0.87';
+our $VERSION = '0.89_01';
$VERSION = eval $VERSION;
our $AUTHORITY = 'cpan:STEVAN';
resolve_metaclass_alias
add_method_modifier
english_list
+ meta_attribute_alias
+ meta_class_alias
];
Sub::Exporter::setup_exporter({
sub apply_all_roles {
my $applicant = shift;
- _apply_all_roles($applicant, sub { 1 }, @_);
+ _apply_all_roles($applicant, undef, @_);
}
sub _apply_all_roles {
}
}
- @$roles = grep { local $_ = $_->[0]; $role_filter->() } @$roles;
+ if ( defined $role_filter ) {
+ @$roles = grep { local $_ = $_->[0]; $role_filter->() } @$roles;
+ }
return unless @$roles;
return resolve_metaclass_alias( @_, trait => 1 );
}
+sub _build_alias_package_name {
+ my ($type, $name, $trait) = @_;
+ return 'Moose::Meta::'
+ . $type
+ . '::Custom::'
+ . ( $trait ? 'Trait::' : '' )
+ . $name;
+}
+
{
my %cache;
return $cache{$cache_key}{$metaclass_name}
if $cache{$cache_key}{$metaclass_name};
- my $possible_full_name
- = 'Moose::Meta::'
- . $type
- . '::Custom::'
- . ( $options{trait} ? "Trait::" : "" )
- . $metaclass_name;
+ my $possible_full_name = _build_alias_package_name(
+ $type, $metaclass_name, $options{trait}
+ );
my $loaded_class = Class::MOP::load_first_existing_class(
$possible_full_name,
sub add_method_modifier {
my ( $class_or_obj, $modifier_name, $args ) = @_;
- my $meta = find_meta($class_or_obj);
+ my $meta
+ = $class_or_obj->can('add_before_method_modifier')
+ ? $class_or_obj
+ : find_meta($class_or_obj);
my $code = pop @{$args};
my $add_modifier_method = 'add_' . $modifier_name . '_method_modifier';
if ( my $method_modifier_type = ref( @{$args}[0] ) ) {
return \%info;
}
+sub _create_alias {
+ my ($type, $name, $trait, $for) = @_;
+ my $package = _build_alias_package_name($type, $name, $trait);
+ Class::MOP::Class->initialize($package)->add_method(
+ register_implementation => sub { $for }
+ );
+}
+
+sub meta_attribute_alias {
+ my ($to, $from) = @_;
+ $from ||= caller;
+ my $meta = Class::MOP::class_of($from);
+ my $trait = $meta->isa('Moose::Meta::Role');
+ _create_alias('Attribute', $to, $trait, $from);
+}
+
+sub meta_class_alias {
+ my ($to, $from) = @_;
+ $from ||= caller;
+ my $meta = Class::MOP::class_of($from);
+ my $trait = $meta->isa('Moose::Meta::Role');
+ _create_alias('Class', $to, $trait, $from);
+}
+
1;
__END__
The C<$applicant> must already have a metaclass object.
The list of C<@roles> should be a list of names, each of which can be
-followed by an optional hash reference of options (C<excludes> and
-C<alias>).
+followed by an optional hash reference of options (C<-excludes> and
+C<-alias>).
=item B<ensure_all_roles($applicant, @roles)>
metaclass => "Bar",
);
-The name resolution mechanism is covered in L<Moose/Trait Name
-Resolution>.
+The name resolution mechanism is covered in
+L<Moose/Metaclass and Trait Name Resolution>.
=item B<english_list(@items)>
("one and two", "one, two, three, and four"). This is used to help us
make nicer error messages.
+=item B<meta_class_alias($to[, $from])>
+
+=item B<meta_attribute_alias($to[, $from])>
+
+Create an alias from the class C<$from> (or the current package, if
+C<$from> is unspecified), so that
+L<Moose/Metaclass and Trait Name Resolution> works properly.
+
=back
=head1 TODO