「Xのリファレンスかどうか」の判定

Xのリファレンスかどうかの判定はどう考えればいいんだろう。とりあえず配列リファレンスで考えてみる。
まず,基本的な考え方は以下の4つだと思う。

use Scalar::Util qw(reftype);
ref($x) eq 'ARRAY';     # 1
reftype($x) eq 'ARRAY'; # 2
ref($x) eq 'ARRAY' && overload::Method($x, '@{}');     # 3
reftype($x) eq 'ARRAY' && overload::Method($x, '@{}'); # 4

現実に使われるものを見てみると,1がMooseとParams::Util::_ARRAY()で採用されていて,4がParams::Util::_ARRAYLIKE()で採用されている。
しかしながら,オブジェクトに関してはその実装に関与するべきではなく,reftype()を使う理由はないんじゃないかと思う。また配列化演算子オーバーロードしているということは,配列リファレンスが要求されるところでそのオブジェクトを使えるという宣言に他ならないので,配列リファレンスと考えていいはずだ。だから,配列リファレンスの判定は3がいいということになるはずじゃないだろうか。
ということを踏まえて,Data::Util::is_array_ref()は3の方法でチェックをしているんだけど,イマイチ自信がないなあ。この考え方でいいんだろうか。