package HTML::MobileJp::Filter::Content; use Any::Moose; has _current => ( is => 'rw', isa => 'Any', ); has html => ( is => 'rw', isa => 'Str', trigger => sub { shift->_current('html'); }, ); has xml => ( is => 'rw', isa => 'XML::LibXML::Document', trigger => sub { shift->_current('xml'); }, ); use overload '""' => 'stringfy', fallback => 1; *stringfy = \&as_html; use XML::LibXML; sub update { my ($self, $content) = @_; if (ref($content) and $content->isa(__PACKAGE__)) { $self->{$_} = $content->{$_} for qw( html xml ); } elsif (ref($content) and $content->isa('XML::LibXML::Document')) { $self->xml($content); } else { $self->html($content); } } sub as_html { my ($self) = @_; if ($self->_current ne 'html') { $self->html( $self->xml->toString ) if $self->_current ne 'html'; } $self->html; } sub as_xml { my ($self) = @_; if ($self->_current ne 'xml') { $self->xml( XML::LibXML->new->parse_string($self->html) ); } $self->xml; } __PACKAGE__->meta->make_immutable; 1;