Algorithm-Dependency

 view release on metacpan or  search on metacpan

lib/Algorithm/Dependency/Source/File.pm  view on Meta::CPAN

#pod Anything that is not a word character will be assumed to be a separator.
#pod
#pod The first word will be used as the name or id of the item, and any further
#pod words in the line will be used as other items that this one depends on. For
#pod example, all of the following are legal.
#pod
#pod   # A single item with no dependencies
#pod   Foo
#pod
#pod   # Another item that depends on the first one
#pod   Bar Foo
#pod
#pod   # Depending on multiple others
#pod   Bin Foo Bar
#pod
#pod   # We can use different separators
#pod   One:Two|Three-Four+Five=Six Seven
#pod
#pod   # We can also use multiple non-word characters as separators
#pod   This&*&^*&File:  is& & & :::REALLY()Neat
#pod
#pod From the examples above, it should be easy to create your own files.
#pod
#pod =head1 METHODS
#pod
#pod This documents the methods differing from the ordinary
#pod L<Algorithm::Dependency::Source> methods.
#pod
#pod =cut

use 5.005;
use strict;
use Algorithm::Dependency::Source ();

our $VERSION = '1.112';
our @ISA     = 'Algorithm::Dependency::Source';




#####################################################################
# Constructor

#pod =pod
#pod
#pod =head2 new $filename
#pod
#pod When constructing a new Algorithm::Dependency::Source::File object, an
#pod argument should be provided of the name of the file to use. The constructor
#pod will check that the file exists, and is readable, returning C<undef>
#pod otherwise.
#pod
#pod =cut

sub new {
	my $class    = shift;
	my $filename = shift or return undef;
	return undef unless -r $filename;

	# Get the basic source object
	my $self = $class->SUPER::new() or return undef;

	# Add our arguments
	$self->{filename} = $filename;

	$self;
}





#####################################################################
# Private Methods

sub _load_item_list {
	my $self = shift;

	# Load the contents of the file
	local $/ = undef;
	open( FILE, $self->{filename} ) or return undef;
	defined(my $source = <FILE>)    or return undef;
	close( FILE )                   or return undef;

	# Split, trim, clean and remove comments
	my @content = grep { ! /^\s*(?:\#|$)/ } 
		split /\s*[\015\012][\s\015\012]*/, $source;

	# Parse and build the item list
	my @Items = ();
	foreach my $line ( @content ) {
		# Split the line by non-word characters
		my @sections = grep { length $_ } split /\W+/, $line;
		return undef unless scalar @sections;

		# Create the new item
		my $Item = Algorithm::Dependency::Item->new( @sections ) or return undef;
		push @Items, $Item;
	}

	\@Items;
}

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Algorithm::Dependency::Source::File - File source for dependency hierarchies

=head1 VERSION

version 1.112

=head1 DESCRIPTION



( run in 0.582 second using v1.01-cache-2.11-cpan-39bf76dae61 )