lose .= and = overrides - fallback means the . override will handle it
[scpubgit/HTML-String.git] / lib / HTML / String / Value.pm
CommitLineData
e1b4b35c 1package HTML::String::Value;
2
3use strictures 1;
586054e0 4use UNIVERSAL::ref;
e1b4b35c 5use Safe::Isa;
6use Data::Munge;
7
e1b4b35c 8use overload
9 '""' => 'escaped_string',
10 '.' => 'dot',
e1b4b35c 11
e1b4b35c 12 fallback => 1,
13;
14
15sub new {
16 my ($class, @raw_parts) = @_;
17
51eaef0b 18 my @parts = map {
19 if (ref($_) eq 'ARRAY') {
20 $_
21 } elsif ($_->$_isa(__PACKAGE__)) {
22 @{$_->{parts}}
23 } else {
24 [ $_, 0 ]
25 }
26 } @raw_parts;
e1b4b35c 27
28 my $self = bless { parts => \@parts }, $class;
29
30 return $self;
31}
32
33sub escaped_string {
34 my $self = shift;
35
36 return join '', map +(
37 $_->[1]
38 ? byval {
39 s/&/&/g;
40 s/</&lt;/g;
41 s/>/&gt;/g;
42 s/"/&quot;/g;
43 } $_->[0]
44 : $_->[0]
45 ), @{$self->{parts}};
46}
47
48sub unescaped_string {
49 my $self = shift;
50
51 return join '', map $_->[0], @{$self->{parts}};
52}
53
54sub dot {
55 my ($self, $str, $prefix) = @_;
56
57 return $self unless $str;
58
59 my @parts = @{$self->{parts}};
60
61 my @new_parts = (
62 $str->$_isa(__PACKAGE__)
63 ? @{$str->{parts}}
64 : [ $str, 1 ]
65 );
66
67 if ( $prefix ) {
68 unshift @parts, @new_parts;
69 } else {
70 push @parts, @new_parts;
71 }
72
73 return ref($self)->new(@parts);
74}
75
586054e0 76sub ref { '' }
77
e1b4b35c 781;