package Perl6::PVIP::Node;
use strict;
use warnings;

# most of methods are written in xs.

sub perl {
    my $self = shift;
    +{
        type        => $self->type,
        line_number => $self->line_number,
        value       => do {
            if ($self->category == Perl6::PVIP::PVIP_CATEGORY_CHILDREN()) {
                [map { $_->perl } @{$self->value}];
            } else {
                $self->value;
            }
        }
    };
}

1;

__END__

=head1 NAME

Perl6::PVIP::Node - Node object

=head1 DESCRIPTION

This is a node representation in Perl6::PVIP.

=head1 METHODS

=over 4

=item $node->type()

This method returns the method type in C<PVIP_NODE_*> constants.

=item $node->name()

String representation of the type from the node.

=item $node->value() : Str|Int|Number|ArrayRef[Perl6::PVIP::Node]

This method returns the value, the node has.


=item $node->as_sexp(): Str

This method converts the node as S-Expression.

=item $node->category() : Int

This method returns the category of the node.
It's one of the following

=over 4

=item PVIP_CATEGORY_INT

=item PVIP_CATEGORY_NUMBER

=item PVIP_CATEGORY_STRING

=item PVIP_CATEGORY_CHILDREN

=item PVIP_CATEGORY_UNKNOWN

=back

=back