X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FHTML%2FString%2FValue.pm;h=e1f6c9577aee3ef685b2b9c7778a613473c9ad03;hb=e8420dab517c57d30d9a3fa22de9966dc1c99c1b;hp=38699ea3645fd675d4b12440d0910ecfd6c5af06;hpb=fc076557b01b935910c07ed26c2710b78bd10ce0;p=scpubgit%2FHTML-String.git diff --git a/lib/HTML/String/Value.pm b/lib/HTML/String/Value.pm index 38699ea..e1f6c95 100644 --- a/lib/HTML/String/Value.pm +++ b/lib/HTML/String/Value.pm @@ -3,6 +3,7 @@ package HTML::String::Value; use strictures 1; use UNIVERSAL::ref; use Safe::Isa; +use Scalar::Util qw(blessed); use Data::Munge; use overload @@ -14,7 +15,10 @@ use overload ; sub new { - if (ref($_[0])) { my $c = shift; return $c->_hsv_unescaped_string->new(@_) } + if (blessed($_[0])) { + my $c = shift; + return $c->_hsv_unescaped_string->new(@_); + } my ($class, @raw_parts) = @_; my $opts = (ref($raw_parts[-1]) eq 'HASH') ? pop(@raw_parts) : {}; @@ -71,7 +75,7 @@ sub _hsv_unescaped_string { sub _hsv_dot { my ($self, $str, $prefix) = @_; - return $self unless $str; + return $self unless defined $str && length $str; my @parts = @{$self->{parts}}; @@ -87,7 +91,7 @@ sub _hsv_dot { push @parts, @new_parts; } - return ref($self)->new(@parts, { ignore => $self->{ignore} }); + return bless({ %$self, parts => \@parts }, blessed($self)); } sub _hsv_is_true { @@ -95,10 +99,17 @@ sub _hsv_is_true { return 1 if grep $_, map $_->[0], @{$self->{parts}}; } +# we need to local $@ here because some modules (cough, TT, cough) +# will do a 'die $@ if $@' without realising that it wasn't their eval +# that set it + sub isa { my $self = shift; return ( - eval { $self->_hsv_unescaped_string->isa(@_) } + do { + local $@; + eval { blessed($self) and $self->_hsv_unescaped_string->isa(@_) } + } or $self->SUPER::isa(@_) ); } @@ -106,7 +117,10 @@ sub isa { sub can { my $self = shift; return ( - eval { $self->_hsv_unescaped_string->can(@_) } + do { + local $@; + eval { blessed($self) and $self->_hsv_unescaped_string->isa(@_) } + } or $self->SUPER::can(@_) ); }