initial skeleton for deparser
[scpubgit/DX.git] / lib / DX / Deparse.pm
CommitLineData
381e8dad 1package DX::Deparse;
2
3use DX::Class;
4
5sub indent_by { ' ' }
6
7sub max_width { 78 }
8
9sub _inner_meta {
10 my ($self, $ometa) = @_;
11 +{ %$ometa, width_left => $ometa->{width_left} - length $self->indent_by };
12}
13
14sub _indent_one {
15 my ($self, $to_indent) = @_;
16 $to_indent =~ s/^/${\$self->indent_by}/mg;
17 $to_indent;
18}
19
20sub fmt {
21 my ($self, $thing) = @_;
22 $self->_fmt($thing, { width_left => $self->max_width })."\n";
23}
24
25sub _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
32sub _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
41sub _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
51sub _fmt_value_number { $_[1]->number_value }
52
53sub _fmt_value_true { 'true' }
54
55sub _fmt_value_false { 'false' }
56
57sub _fmat_value_unset { 'unset' }
58
591;