如何在perl中发现对象类型?

时间:2013-12-06 12:00:49

标签: perl

情景:

  • 有几个对象,由My::ModulePath::Class创建,类似于......
  • 每个对象可以返回一些调用specific method
  • 的字符串值
  • 需要构建一个HashRef,其中values是字符串,

所以像(非常缩短):

package Some;
sub filename { file('/tmp/xxx') }   #Path::Class the filename->stringify' returns the string value
sub myobj { My::Module->new(....) } #the myobj->stringvalue returns the string value
sub text { 'some text' }

sub data {
    my $strhr;
    $strhr->{$_} = $self->make_string $self->$_ for(qw(filename myobj text));
    return $strhr;
}

sub make_string {
    my($self, $val) = @_;
    return $val->stringify if( VAL_IS_PATH::CLASS_OBJ ); #need help here
    return $val->stringvalue if( VAL_IS_My::Obj_OBJ ); #and here
    return $val if( VAL_IS_SIMPLE_STRING ); #and here
    croak "unknown value";
}

在真实代码中,filenamemyobj是用Moose定义的,例如:

has 'myobj' => (isa => 'My::Module', builder => ... ...);

但在这种情况下,恕我直言所做的一些Moose-ish deep-coercion要比制作一个简单的make_string过滤子更复杂。但是,我对任何推荐的解决方案都开放了......

所以,问题是 - 如何发现$val的对象,或者它是一个简单的Str

修改

基于 @David W。的评论我得到了下一个:

sub make_string {
    my($self, $val) = @_;
    my $vref = ref $val;   #for the "text"  returns the string itself
    return $val->stringify if( $vref =~ /^Path::Class/ ); #works
    return $val->stringvalue if( $vref =~ /^My::Module/ ); #works
    return $val if( VAL_IS_SIMPLE_STRING ); #returns the string itself, so how to check this???
    croak "unknown value";
}

1 个答案:

答案 0 :(得分:7)

使用isa方法。它在UNIVERSAL包中定义(参见perldoc UNIVERSAL)。所有Perl类都隐式继承自UNIVERSAL。

use Scalar::Util qw( blessed );

if (blessed($val) and $val->isa('Path::Class')) {
    print "It's a Path::Class object!\n";
}