package Parse::Method::Signatures::Param::Named;

use Moose::Role;
use MooseX::Types::Moose qw/Str/;

use namespace::clean -except => 'meta';

has label => (
    is         => 'ro',
    isa        => Str,
    lazy_build => 1,
);

sub _label_from_variable_name {
    my ($self) = @_;
    # strip sigil
    return substr($self->variable_name, 1);
}

sub _build_label {
    my ($self) = @_;
    return $self->_label_from_variable_name;
}

sub _stringify_required {
    my ($self) = @_;
    return $self->required ? q{!} : q{};
}

around _stringify_variable_name => sub {
    my $orig = shift;
    my ($self) = @_;
    my $ret = q{:};
    my ($before, $after) = (q{}) x 2;

    my $implicit_label = $self->_label_from_variable_name if $self->can('variable_name');

    if (!$implicit_label || $self->label ne $implicit_label) {
        $before = $self->label . q{(};
        $after  = q{)};
    }

    $ret .= $before . $orig->(@_) . $after;

    return $ret;
};

1;