# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
package Apache2::PerlSections::Dump;

use strict;
use warnings FATAL => 'all';

our $VERSION = '0.01';

use Apache2::PerlSections;
our @ISA = qw(Apache2::PerlSections);

use Data::Dumper;

# Process all saved packages
sub package     { return shift->saved }

# We don't want to save anything
sub save        { return }

# We don't want to post any config to apache, we are dumping
sub post_config { return }

sub dump {
    my $self = shift;
    unless (ref $self) {
        $self = $self->new;
    }
    $self->handler();
    return join "\n", @{$self->directives}, '1;', '__END__', '';
}

sub store {
    my ($class, $filename) = @_;
    require IO::File;

    my $fh = IO::File->new(">$filename") or die "can't open $filename $!\n";

    $fh->print($class->dump);

    $fh->close;
}

sub dump_array {
     my ($self, $name, $entry) = @_;
     $self->add_config(Data::Dumper->Dump([$entry], ["*$name"]));
}

sub dump_hash {
    my ($self, $name, $entry) = @_;
    for my $elem (sort keys %{$entry}) {
        $self->add_config(Data::Dumper->Dump([$entry->{$elem}],
                                             ["\$$name"."{'$elem'}"]));
    }

}

sub dump_entry {
    my ($self, $name, $entry) = @_;

    return if not defined $entry;
    my $type = ref($entry);

    if ($type eq 'SCALAR') {
        $self->add_config(Data::Dumper->Dump([$$entry],[$name]));
    }
    if ($type eq 'ARRAY') {
        $self->dump_array($name,$entry);
    }
    else {
        $self->add_config(Data::Dumper->Dump([$entry],[$name]));
    }
}

sub dump_special {
    my ($self, @data) = @_;

    my @dump = grep { defined } @data;
    return unless @dump;

    $self->add_config(Data::Dumper->Dump([\@dump],['*'.$self->SPECIAL_NAME]));
}



1;
__END__
