package Graph::Reader::OID;

# Pragmas.
use base qw(Graph::Reader);
use strict;
use warnings;

# Modules.
use Readonly;

# Constants.
Readonly::Scalar our $DOT => q{.};
Readonly::Scalar our $EMPTY_STR => q{};

# Version.
our $VERSION = 0.03;

# Read graph subroutine.
sub _read_graph {
	my ($self, $graph, $fh) = @_;
	while (my $line = <$fh>) {
		chomp $line;

		# End of vertexes section.
		if ($line =~ m/^#/ms) {
			next;
		}

		# Process OID.
		my ($line_oid, $line_label) = split m/\s+/ms, $line, 2;
		my @oid = split m/\./ms, $line_oid;
		my $last_oid;
		my $act_oid = $EMPTY_STR;
		foreach my $oid (@oid) {
			if ($act_oid ne $EMPTY_STR) {
				$act_oid .= $DOT;
			}
			$act_oid .= $oid;
			$graph->add_vertex($act_oid);
			if ($act_oid eq $line_oid) {
				if (! $line_label) {
					$line_label = $line_oid;
				}
				$graph->set_vertex_attribute($act_oid, 'label',
					$line_label);
			}
			if (defined $last_oid) {
				$graph->add_edge($last_oid, $act_oid);
			}
			$last_oid = $act_oid;
		}
	}
	return;
}

1;

__END__

=pod

=encoding utf8

=head1 NAME

Graph::Reader::OID - Perl class for reading a graph from OID format.

=head1 SYNOPSIS

 use Graph::Reader::OID;
 my $obj = Graph::Reader::OID->new;
 my $graph = $obj->read_graph($oid_file);

=head1 METHODS

=over 8

=item C<new()>

 Constructor.
 This doesn't take any arguments.
 Returns Graph::Reader::OID object.

=item C<read_graph($tgf_file)>

 Read a graph from the specified file.
 The argument can either be a filename, or a filehandle for a previously opened file.
 Returns Graph object.

=back

=head1 OID FILE FORMAT

 File format with OID list.
 For OID (Object identifier) see L<Object identifier|https://en.wikipedia.org/wiki/Object_identifier>
 Example:
 1.2.410.200047.11.2013.10234913023321120142141561581 Label #1
 1.2.276.0.7230010.3.0.3.6.1 Label #2

=head1 EXAMPLE

 # Pragmas.
 use strict;
 use warnings;

 # Modules.
 use Graph::Reader::OID;
 use IO::Barf qw(barf);
 use File::Temp qw(tempfile);

 # Example data.
 my $data = <<'END';
 1.2.410.200047.11.2013.10234913023321120142141561581 Label #1
 1.2.276.0.7230010.3.0.3.6.1 Label #2
 END

 # Temporary file.
 my (undef, $tempfile) = tempfile();

 # Save data to temp file.
 barf($tempfile, $data);

 # Reader object.
 my $obj = Graph::Reader::OID->new;

 # Get graph from file.
 my $g = $obj->read_graph($tempfile);

 # Print to output.
 print $g."\n";

 # Clean temporary file.
 unlink $tempfile;

 # Output:
 # 1-1.2,1.2-1.2.276,1.2-1.2.410,1.2.276-1.2.276.0,1.2.276.0-1.2.276.0.7230010,1.2.276.0.7230010-1.2.276.0.7230010.3,1.2.276.0.7230010.3-1.2.276.0.7230010.3.0,1.2.276.0.7230010.3.0-1.2.276.0.7230010.3.0.3,1.2.276.0.7230010.3.0.3-1.2.276.0.7230010.3.0.3.6,1.2.276.0.7230010.3.0.3.6-1.2.276.0.7230010.3.0.3.6.1,1.2.410-1.2.410.200047,1.2.410.200047-1.2.410.200047.11,1.2.410.200047.11-1.2.410.200047.11.2013,1.2.410.200047.11.2013-1.2.410.200047.11.2013.10234913023321120142141561581

=head1 DEPENDENCIES

L<Graph::Reader>,
L<Readonly>.

=head1 SEE ALSO

=over

=item L<Graph::Reader>

base class for Graph file format readers

=item L<Task::Graph::Reader>

Install the Graph::Reader modules.

=item L<Task::Graph::Writer>

Install the Graph::Writer modules.

=back

=head1 REPOSITORY

L<https://github.com/tupinek/Graph-Reader-OID>

=head1 AUTHOR

Michal Špaček L<mailto:skim@cpan.org>

L<http://skim.cz>

=head1 LICENSE AND COPYRIGHT

 © 2014-2015 Michal Špaček
 BSD 2-Clause License

=head1 VERSION

0.03

=cut
