X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP%2FMixin%2FHasMethods.pm;h=5f6a4db08d868ce5f3bd5736a3679323283d6647;hb=87a1f36e0f0e38af826028d2dbd8b3d85ccca101;hp=9ecfd69887df86cd84ba111533e8112a2abb6787;hpb=4a0bc88fdddbc5c840810dd31b8873c88ff85282;p=gitmo%2FMoose.git diff --git a/lib/Class/MOP/Mixin/HasMethods.pm b/lib/Class/MOP/Mixin/HasMethods.pm index 9ecfd69..5f6a4db 100644 --- a/lib/Class/MOP/Mixin/HasMethods.pm +++ b/lib/Class/MOP/Mixin/HasMethods.pm @@ -211,16 +211,21 @@ sub overload_operators { return @$overload_operators; } +sub is_overloaded { + my $self = shift; + return overload::Overloaded($self->name); +} + # XXX this could probably stand to be cached, but i figure it should be # uncommon enough to not particularly matter sub _overload_map { my $self = shift; - return {} unless overload::Overloaded($self->name); + return {} unless $self->is_overloaded; my %map; for my $op ($self->overload_operators) { - my $body = overload::Method($self->name, $op); + my $body = $self->_get_overloaded_operator_body($op); next unless defined $body; $map{$op} = $body; } @@ -230,25 +235,25 @@ sub _overload_map { sub get_overload_list { my $self = shift; - my $map = $self->_overload_map; - return map { $self->_wrap_overload($_, $map->{$_}) } keys $map; + return keys $self->_overload_map; } -sub get_overloaded_operators { +sub get_all_overloaded_operators { my $self = shift; - return keys $self->_overload_map; + my $map = $self->_overload_map; + return map { $self->_wrap_overload($_, $map->{$_}) } keys $map; } sub has_overloaded_operator { my $self = shift; my ($op) = @_; - return defined overload::Method($self->name, $op); + return defined $self->_get_overloaded_operator_body($op); } sub get_overloaded_operator { my $self = shift; my ($op) = @_; - my $body = overload::Method($self->name, $op); + my $body = $self->_get_overloaded_operator_body($op); return unless defined $body; return $self->_wrap_overload($op, $body); } @@ -259,6 +264,12 @@ sub add_overloaded_operator { $self->name->overload::OVERLOAD($op => $body); } +sub _get_overloaded_operator_body { + my $self = shift; + my ($op) = @_; + return overload::Method($self->name, $op); +} + sub _wrap_overload { my $self = shift; my ($op, $body) = @_;