Map-Metro

 view release on metacpan or  search on metacpan

lib/Map/Metro.pm  view on Meta::CPAN

        all_hooks => 'elements',
        hook_count => 'count',
    },
);
has _plugin_ns => (
    is => 'ro',
    isa => Str,
    default => 'Plugin::Map',
    init_arg => undef,
);

around BUILDARGS => sub {
    my ($orig, $class, @args) = @_;
    my %args;
    if(scalar @args == 1) {
        $args{'map'} = shift @args;
    }
    elsif(scalar @args % 2 != 0) {
        my $map = shift @args;
        %args = @args;
        $args{'map'} = $map;
    }
    else {
        %args = @args;
    }

    if(exists $args{'map'} && !ArrayRef->check($args{'map'})) {
        $args{'map'} = [$args{'map'}];
    }
    if(exists $args{'hooks'} && !ArrayRef->check($args{'hooks'})) {
        $args{'hooks'} = [$args{'hooks'}];
    }

    return $class->$orig(%args);
};

sub BUILD {
    my $self = shift;
    my @args = @_;

    if($self->has_map) {
        my @system_maps = map { s{^Map::Metro::Plugin::Map::}{}; $_ } $self->system_maps;
        if(any { $_ eq $self->get_map(0) } @system_maps) {
            my $mapclass = 'Map::Metro::Plugin::Map::'.$self->get_map(0);
            my $mapobj = $mapclass->new(hooks => $self->hooks);
            $self->add_mapclass($mapobj);
        }
        else {
            try { die no_such_map mapname => $self->get_map(0) } catch { die $_->desc };
        }
    }
}

# Borrowed from Mojo::Util
sub decamelize {
    my $self = shift;
    my $string = shift;

    return $string if $string !~ m{[A-Z]};
    return join '_' => map {
                              join ('_' => map { lc } grep { length } split m{([A-Z]{1}[^A-Z]*)})
                           } split '::' => $string;
}

sub parse {
    my $self = shift;
    my %args = @_;

    return Map::Metro::Graph->new(filepath => $self->get_mapclass(0)->maplocation,
                                  do_undiacritic => $self->get_mapclass(0)->do_undiacritic,
                                  wanted_hook_plugins => [$self->all_hooks],
                                  exists $args{'override_line_change_weight'} ? (override_line_change_weight => $args{'override_line_change_weight'}) : (),
                            )->parse;
}

sub available_maps {
    my $self = shift;
    return sort $self->system_maps;
}

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Map::Metro - Public transport graphing



=begin html

<p>
<img src="https://img.shields.io/badge/perl-5.10+-blue.svg" alt="Requires Perl 5.10+" />
<a href="https://travis-ci.org/Csson/p5-Map-Metro"><img src="https://api.travis-ci.org/Csson/p5-Map-Metro.svg?branch=master" alt="Travis status" /></a>
<a href="http://cpants.cpanauthors.org/dist/Map-Metro-0.2405"><img src="https://badgedepot.code301.com/badge/kwalitee/Map-Metro/0.2405" alt="Distribution kwalitee" /></a>
<a href="http://matrix.cpantesters.org/?dist=Map-Metro%200.2405"><img src="https://badgedepot.code301.com/badge/cpantesters/Map-Metro/0.2405" alt="CPAN Testers result" /></a>
<img src="https://img.shields.io/badge/coverage-72.9%-red.svg" alt="coverage 72.9%" />
</p>

=end html

=head1 VERSION

Version 0.2405, released 2016-07-23.

=head1 SYNOPSIS

    # Install a map
    $ cpanm Map::Metro::Plugin::Map::Stockholm

    # And then
    my $graph = Map::Metro->new('Stockholm', hooks => ['PrettyPrinter'])->parse;

    my $routing = $graph->routing_for('Universitetet', 'Kista');

    # or in a terminal



( run in 0.793 second using v1.01-cache-2.11-cpan-71847e10f99 )