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

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

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

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

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

use Geometry::Primitive::Bezier;

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

Set/Get the first control point of the curve.

Set/Get the second control point of the curve.

Set/Get the end point of the curve.

Set/Get the start point of the line.

Creates a new Geometry::Primitive::Bezier

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

Get the end point.  Provided for Shape role.

Get the start point.  Provided for Shape role.

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