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 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