Use coercion in your attributes in Funky::Rectangle.
use Types::Standard qw(InstanceOf Str);
use Data::Dump 'pp';
my $vertex_type = InstanceOf->of('Funky::Vertex')->plus_constructors(S
has 'LL' => (is=>'rw', isa=>$vertex_type, coerce=>1);
has 'UR' => (is=>'rw', isa=>$vertex_type, coerce=>1);
Update: note that this can be achieved using Moose's built-in type constraints, but adding coercions to those has a global effect which can result in spooky action at a distance.