3 package Moose::Meta::Method::VariantTable;
6 extends qw(Moose::Object Moose::Meta::Method);
8 use MooseX::Types::VariantTable;
11 use Sub::Name qw(subname);
13 has _variant_table => (
14 isa => "MooseX::Types::VariantTable",
16 default => sub { MooseX::Types::VariantTable->new },
17 handles => qr/^(?: \w+_variant$ | has_ )/x,
21 isa => "Class::MOP::Class",
36 join "::", $self->class->name, $self->name;
41 isa => "Maybe[Class::MOP::Method]",
49 $self->class->find_next_method_by_name($self->name);
56 builder => "initialize_body",
60 my ( $self, @others ) = @_;
62 return ( ref $self )->new(
63 _variant_table => $self->_variant_table->merge(map { $_->_variant_table } @others),
70 my $variant_table = $self->_variant_table;
72 my $super = $self->super;
73 my $super_body = $super && $super->body;
75 my $name = $self->name;
77 return subname $self->full_name, sub {
78 my ( $self, $value, @args ) = @_;
80 if ( my ( $result, $type ) = $variant_table->find_variant($value) ) {
81 my $method = (ref($result)||'') eq 'CODE'
83 : $self->can($result);
87 return $self->next::method($value, @args);
90 my $dump = eval { require Devel::PartialDump; 1 }
91 ? \&Devel::PartialDump::dump
92 : sub { return join $", map { overload::StrVal($_) } @_ };
94 croak "No variant of method '$name' found for ", $dump->($value, @args);