summaryrefslogblamecommitdiff
path: root/lib/Graph/GEXF/Node.pm
blob: 0d691b74d34540ad10d55a62d4d5a31f15563e49 (plain) (tree)
1
2
3
4
5
6
7
8
9
10


                          
                      





                                                                      











                                                    

                              







                                     















                                                           
















                                                                

         
  



















































                                                                                                                             
package Graph::GEXF::Node;

use Moose;
use Graph::GEXF::Edge;

with
  'Graph::GEXF::Role::Attributes' => { for => [qw/node/] },
  'Graph::GEXF::Role::Viz::Color', 'Graph::GEXF::Role::Viz::Position',
  'Graph::GEXF::Role::Viz::Size'  => { as  => 'size' },
  'Graph::GEXF::Role::Viz::Shape' => { for => 'node' };

has id => (is => 'ro', isa => 'Str', required => 1);
has label => (is => 'rw', isa => 'Str');

has edges => (
    traits  => ['Hash'],
    is      => 'rw',
    isa     => 'HashRef[Graph::GEXF::Edge]',
    default => sub { {} },
    handles => {
        add_edge    => 'set',
        has_link_to => 'exists',
        all_edges   => 'keys',
        get_edge    => 'get',
    }
);

sub link_to {
    my $self     = shift;
    my @nodes_id = @_;

    foreach my $node_id (@nodes_id) {
        my $edge;
        if ( ref $node_id ) {
            $edge = Graph::GEXF::Edge->new(
                source => $self->id,
                target => $node_id->{target},
                weight => $node_id->{weight}
            );
            $self->add_edge( $node_id->{target} => $edge );
        }
        else {
            $edge = Graph::GEXF::Edge->new(
                source => $self->id,
                target => $node_id,
            );
            $self->add_edge( $node_id => $edge );
        }
    }
}

sub attribute {
    my ($self, $attribute_name, $value) = @_;

#    return 0 unless $self->has_node_attribute;

    if (!$self->has_node_attribute($attribute_name)) {
        die "this attribute doesn't exists";
    }

    $self->node_attributes->{$attribute_name}->{value} = $value;

    1;
}

no Moose;

1;

=head1 SYNOPSIS

    my $graph = Graph::GEXF->new();

    my $n = $graph->add_node;

=head1 DESCRIPTION

=head2 ATTRIBUTES

=head3 id

    my $n = $graph->add_node(1);
    $n->id; # returns 1

The B<id> of a node can't be changed once the node is created.

=head3 label

    $n->label('franckcuny');
    $n->label();

Each node has a label. If the B<label> is not defined, the default value is the B<id>. This value can be changed at any time.

=head2 METHODS

=head3 link_to

   my $n1 = $graph->add_node();
   my $n2 = $graph->add_node();
   my $n3 = $graph->add_node();

   $n1->link_to($n2->id);
   $n1->link_to($n3->id);

   # or
   $n1->link_to($n2->id, $n3->id);

This method will create an edge between some nodes.

=head3 attribute

=head3 add_edge

=head3 has_link_to

=head3 all_edges

=head3 get_edge

=head3