initial skeleton for deparser
[scpubgit/DX.git] / lib / DX / Deparse.pm
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;