Commit | Line | Data |
381e8dad |
1 | package DX::Deparse; |
2 | |
3 | use DX::Class; |
4 | |
5 | sub indent_by { ' ' } |
6 | |
7 | sub max_width { 78 } |
8 | |
9 | sub _inner_meta { |
10 | my ($self, $ometa) = @_; |
11 | +{ %$ometa, width_left => $ometa->{width_left} - length $self->indent_by }; |
12 | } |
13 | |
14 | sub _indent_one { |
15 | my ($self, $to_indent) = @_; |
16 | $to_indent =~ s/^/${\$self->indent_by}/mg; |
17 | $to_indent; |
18 | } |
19 | |
20 | sub fmt { |
21 | my ($self, $thing) = @_; |
22 | $self->_fmt($thing, { width_left => $self->max_width })."\n"; |
23 | } |
24 | |
25 | sub _fmt { |
26 | my ($self, $thing, $meta) = @_; |
27 | return $thing unless ref($thing); |
28 | my $type = join'_', split '::', lc +(ref($thing) =~ /^DX::(.*)/)[0]; |
29 | $self->${\"_fmt_${type}"}($thing, $meta); |
30 | } |
31 | |
32 | sub _fmt_value_dict { |
33 | my ($self, $dict, $ometa) = @_; |
34 | my $imeta = $self->_inner_meta($ometa); |
35 | my $chunks = $self->_indent_one(join "\n", map { |
36 | "$_ ".$self->_fmt($dict->get_member_at($_), $imeta) |
37 | } $dict->index_list); |
38 | "{{\n${chunks}\n}}"; |
39 | } |
40 | |
41 | sub _fmt_value_string { |
42 | my ($self, $string) = @_; |
43 | my $val = $string->string_value; |
44 | if ($val =~ /^\w+$/) { |
45 | qq{'${val}'} |
46 | } else { |
47 | qq{{'${val}'}} |
48 | } |
49 | } |
50 | |
51 | sub _fmt_value_number { $_[1]->number_value } |
52 | |
53 | sub _fmt_value_true { 'true' } |
54 | |
55 | sub _fmt_value_false { 'false' } |
56 | |
57 | sub _fmat_value_unset { 'unset' } |
58 | |
59 | 1; |