package Geometry::Primitive::Bezier;
use Moose;
use MooseX::Storage;

with qw(Geometry::Primitive::Shape MooseX::Clone MooseX::Storage::Deferred);

use overload ('""' => 'to_string');

use Geometry::Primitive::Point;

has 'control1' => (
    is => 'rw',
    isa => 'Geometry::Primitive::Point',
    required => 1,
    coerce => 1
);
has 'control2' => (
    is => 'rw',
    isa => 'Geometry::Primitive::Point',
    required => 1,
    coerce => 1
);
has 'end' => (
    is => 'rw',
    isa => 'Geometry::Primitive::Point',
    required => 1,
    coerce => 1
);
has 'start' => (
    is => 'rw',
    isa => 'Geometry::Primitive::Point',
    required => 1,
    coerce => 1
);

sub scale {
    my ($self, $amount) = @_;

    $self->start->x($self->start->x * $amount);
    $self->start->y($self->start->y * $amount);

    $self->end->x($self->end->x * $amount);
    $self->end->y($self->end->y * $amount);

    $self->control1->x($self->control1->x * $amount);
    $self->control1->y($self->control1->y * $amount);

    $self->control2->x($self->control2->x * $amount);
    $self->control2->y($self->control2->y * $amount);
}

sub point_end {
    my ($self) = @_; return $self->end;
}

sub point_start {
    my ($self) = @_; return $self->start;
}


sub to_string {
    my ($self) = @_;

    return $self->start->to_string.' - '.$self->control1->to_string
        .' = '.$self->control2->to_string.' = '.$self->end->to_string;
}

__PACKAGE__->meta->make_immutable;

no Moose;
1;

__END__

=encoding UTF-8

=head1 NAME

Geometry::Primitive::Bezier - Cubic Bézier Curve

=head1 DESCRIPTION

Geometry::Primitive::Bezier represents a cubic Bézier curve.

=head1 SYNOPSIS

  use Geometry::Primitive::Bezier;

  my $line = Geometry::Primitive::Bezier->new(
      start => $point1,
      control1 => $point2,
      control2 => $point3,
      end => $point4
  );

=head1 ATTRIBUTES

=head2 control1

Set/Get the first control point of the curve.

=head2 control2

Set/Get the second control point of the curve.

=head2 end

Set/Get the end point of the curve.

=head2 start

Set/Get the start point of the line.

=head1 METHODS

=head2 new

Creates a new Geometry::Primitive::Bezier

=head2 grow

Does nothing, as I'm not sure how.  Patches or hints welcome.

=head2 point_end

Get the end point.  Provided for Shape role.

=head2 point_start

Get the start point.  Provided for Shape role.

=head2 scale

Scales this curve by the amount provided.  Multiplies each coordinate by the
amount.

=head2 to_string

Guess!

=head1 AUTHOR

Cory Watson <gphat@cpan.org>

=head1 COPYRIGHT & LICENSE

You can redistribute and/or modify this code under the same terms as Perl
itself.