元のメソッドを保存しつつオーバーライドしたい

とあるメソッド(Foo#greet)を呼ぶ前にちょっとごにょごにょ前処理的なことをしたい。
前処理した後は、オリジナルのメソッドを呼びたい。
でも、メソッド名はそのまま(greet)でコールしたい。

こんなんでいいのかなぁ?

#!/usr/bin/env perl

use strict;
use warnings;

package Foo;
sub new {
    my $class = shift;
    bless { @_ }, $class;
}
sub greet {
    my($self) = @_;
    print "Hello, ", $self->{name}, "\n";
}

package main;
{
    # override
    no warnings 'redefine', 'once';
    package Foo;
    *greet_orig = \&greet;
    *greet = sub {
        my($self) = @_;
        $self->{name} .= ' san';

        $self->greet_orig(@_); # call original
    };
}
my $o = Foo->new(name=>'ank');
$o->greet;