Forward-Routes

 view release on metacpan or  search on metacpan

lib/Forward/Routes.pm  view on Meta::CPAN

package Forward::Routes;
use strict;
use warnings;

use 5.010001;

use Forward::Routes::Match;
use Forward::Routes::Pattern;
use Forward::Routes::Resources;
use Scalar::Util qw/weaken/;
use Carp 'croak';

our $VERSION = '0.56';


## ---------------------------------------------------------------------------
##  Constructor
## ---------------------------------------------------------------------------

sub new {
    my $class = shift;
    my $self = bless {}, $class;
    return $self->initialize(@_);
}


sub initialize {
    my $self = shift;

    # block
    my $code_ref = pop @_ if @_ && ref $_[-1] eq 'CODE';

    # inherit
    $self->{_inherit_format} = 1;
    $self->{_inherit_via} = 1;
    $self->{_inherit_namespace} = 1;
    $self->{_inherit_app_namespace} = 1;

    # Pattern
    my $pattern = @_ % 2 ? shift : undef;
    $self->pattern->pattern($pattern) if defined $pattern;

    # Shortcut in case of chained API
    return $self unless @_ || $code_ref;

    # Remaining params
    my $params = ref $_[0] eq 'HASH' ? {%{$_[0]}} : {@_};

    $self->format(delete $params->{format}) if exists $params->{format};
    $self->via(delete $params->{via}) if exists $params->{via};
    $self->namespace(delete $params->{namespace}) if exists $params->{namespace};
    $self->app_namespace(delete $params->{app_namespace}) if exists $params->{app_namespace};
    $self->defaults(delete $params->{defaults});
    $self->name(delete $params->{name});
    $self->to(delete $params->{to});
    $self->constraints(delete $params->{constraints});
    $self->resource_name(delete $params->{resource_name});

    # after inheritance
    $code_ref->($self) if $code_ref;

    return $self;
}


## ---------------------------------------------------------------------------
##  Routes tree
## ---------------------------------------------------------------------------

sub add_route {

lib/Forward/Routes.pm  view on Meta::CPAN

    $params = Forward::Routes::Resources->_prepare_resource_options(@$params);

    my $last_resource;

    while (my $name = shift @$params) {

        my $options;
        if (@$params && ref $params->[0] eq 'HASH') {
            $options = shift @$params;
        }

        $last_resource = $self->_add_singular_resource($name, $options);
    }

    return $last_resource;
}


sub _add_singular_resource {
    my $self = shift;
    my ($resource_name, $options) = @_;

    my $resource = Forward::Routes::Resources::Singular->new($resource_name,
        resource_name => $options->{as} // $resource_name,
        %$options
    );
    $resource->init_options($options);

    $resource->_adjust_nested_resources($self);

    $self->add_child($resource);

    # after _adjust_nested_resources because parent name is needed for route name
    # after add_child because of namespace inheritance for route name
    $resource->preprocess;
   
    $resource->inflate;
    
    return $resource;
}


sub bridge {
    my $self = shift;
    return $self->add_route(@_)->_is_bridge(1);
}


sub children {
    my $self = shift;
    return $self->{children} ||= [];
}


sub parent {
    my $self = shift;
    my ($value) = @_;
    return $self->{parent} unless $value;
    
    $self->{parent} = $value;
    weaken $self->{parent};
    return $self;
}


sub add_child {
    my $self = shift;
    my ($child) = @_;

    # child
    push @{$self->children}, $child;

    # parent
    $child->parent($self);

    # inheritance
    $child->format(        [@{$self->{format}}]   ) if $self->{format}        && $child->_inherit_format;
    $child->via(           [@{$self->{via}}]      ) if $self->{via}           && $child->_inherit_via;
    $child->namespace(     $self->{namespace}     ) if $self->{namespace}     && $child->_inherit_namespace;
    $child->app_namespace( $self->{app_namespace} ) if $self->{app_namespace} && $child->_inherit_app_namespace;

    return $child;
}


## ---------------------------------------------------------------------------
##  Route attributes
## ---------------------------------------------------------------------------

sub app_namespace {
    my $self = shift;
    my (@params) = @_;

    return $self->{app_namespace} unless @params;

    $self->{_inherit_app_namespace} = 0;

    $self->{app_namespace} = $params[0];

    return $self;
}


sub constraints {
    my $self = shift;

    return $self->pattern->constraints unless defined $_[0];

    $self->pattern->constraints(@_);

    return $self;
}


sub defaults {
    my $self = shift;
    my (@params) = @_;

    # Initialize
    my $d = $self->{defaults} ||= {};



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