]> git.vpit.fr Git - perl/modules/LaTeX-TikZ.git/blobdiff - lib/LaTeX/TikZ/Set/Rectangle.pm
This is 0.03
[perl/modules/LaTeX-TikZ.git] / lib / LaTeX / TikZ / Set / Rectangle.pm
index ddb66fcf8671ea508998e2758a52c7dee6ce5d9e..5484bf5ecaa51ab3d1bffb78b7efef8f7d3d375f 100644 (file)
@@ -9,17 +9,34 @@ LaTeX::TikZ::Set::Rectangle - A set object representing a rectangle.
 
 =head1 VERSION
 
-Version 0.01
+Version 0.03
 
 =cut
 
-our $VERSION = '0.01';
+our $VERSION = '0.03';
 
 use LaTeX::TikZ::Set::Point;
 
-use Any::Moose;
+use LaTeX::TikZ::Interface;
+use LaTeX::TikZ::Functor;
 
-with 'LaTeX::TikZ::Set::Op';
+use Mouse;
+
+=head1 RELATIONSHIPS
+
+This class consumes the L<LaTeX::TikZ::Set::Path> role, and as such implements the L</path> method.
+
+=cut
+
+with 'LaTeX::TikZ::Set::Path';
+
+=head1 ATTRIBUTES
+
+=head2 C<from>
+
+The first corner of the rectangle, as a L<LaTeX::TikZ::Set::Point> object.
+
+=cut
 
 has 'from' => (
  is       => 'ro',
@@ -28,6 +45,12 @@ has 'from' => (
  coerce   => 1,
 );
 
+=head2 C<to>
+
+The opposite endpoint of the rectangle, also as a L<LaTeX::TikZ::Set::Point> object.
+
+=cut
+
 has 'to' => (
  is       => 'ro',
  isa      => 'LaTeX::TikZ::Set::Point',
@@ -35,45 +58,82 @@ has 'to' => (
  coerce   => 1,
 );
 
+=head2 C<width>
+
+The algebraic width of the rectangle.
+
+=cut
+
 has 'width' => (
  is  => 'ro',
  isa => 'Num',
 );
 
+=head2 C<height>
+
+The algebraic height of the rectangle.
+
+=cut
+
 has 'height' => (
  is  => 'ro',
  isa => 'Num',
 );
 
+=head1 METHODS
+
+=head2 C<path>
+
+=cut
+
 sub path {
  my $set = shift;
 
  $set->from->path(@_) . ' rectangle ' . $set->to->path(@_);
 }
 
+=head2 C<begin>
+
+=cut
+
+sub begin { $_[0]->from->begin }
+
+=head2 C<end>
+
+=cut
+
+sub end { $_[0]->to->end }
+
+my $meta = __PACKAGE__->meta;
+my $tc1  = $meta->find_attribute_by_name('from')->type_constraint;
+my $tc2  = $meta->find_attribute_by_name('to')->type_constraint;
+
 around 'BUILDARGS' => sub {
  my $orig  = shift;
  my $class = shift;
 
- my $meta = __PACKAGE__->meta;
- my $tc1  = $meta->find_attribute_by_name('from')->type_constraint;
- my $tc2  = $meta->find_attribute_by_name('to')->type_constraint;
-
  if (@_ == 2 and $tc1->check($_[0]) and $tc2->check($_[1])) {
+  my ($from, $to) = @_;
   @_ = (
-   from => $_[0],
-   to   => $_[1],
+   from   => $from,
+   to     => $to,
+   width  => $to->x - $from->x,
+   height => $to->y - $from->y,
   );
  } else {
   my %args = @_;
-  if (not exists $args{to}
-      and exists $args{from} and $tc1->check($args{from})) {
+  if (not exists $args{to} and exists $args{from}) {
    confess(<<'   MSG') unless exists $args{width} and exists $args{height};
 Attributes 'width' and 'height' are required when 'to' was not given
    MSG
+   $args{from} = $tc1->coerce($args{from});
    $meta->find_attribute_by_name($_)->type_constraint->assert_valid($args{$_})
-                                                           for qw/width height/;
-   $args{to} = $args{from}->translate($args{width}, $args{height});
+                                                      for qw<from width height>;
+   my $p = $args{from}->point;
+   $args{to} = LaTeX::TikZ::Point->new(
+    x => $p->x + $args{width},
+    y => $p->y + $args{height},
+   );
    @_ = %args;
   }
  }
@@ -81,20 +141,33 @@ Attributes 'width' and 'height' are required when 'to' was not given
  $class->$orig(@_);
 };
 
-use LaTeX::TikZ::Interface rectangle => sub {
- shift;
- my ($p, $q) = @_;
+LaTeX::TikZ::Interface->register(
+ rectangle => sub {
+  shift;
+  my ($p, $q) = @_;
 
my $is_relative = !blessed($q) && ref($q) eq 'ARRAY';
 my $is_relative = !blessed($q) && ref($q) eq 'HASH';
 
- __PACKAGE__->new(
-  from => $p,
-  ($is_relative ? (width => $q->[0], height => $q->[1]) : (to => $q)),
- );
-};
+  __PACKAGE__->new(
+   from => $p,
+   ($is_relative ? (map +($_ => $q->{$_}), qw<width height>) : (to => $q)),
+  );
+ },
+);
+
+LaTeX::TikZ::Functor->default_rule(
+ (__PACKAGE__) => sub {
+  my ($functor, $set, @args) = @_;
+  $set->new(map { $_ => $set->$_->$functor(@args) } qw<from to>)
+ }
+);
 
 __PACKAGE__->meta->make_immutable;
 
+=head1 SEE ALSO
+
+L<LaTeX::TikZ>, L<LaTeX::TikZ::Set::Path>.
+
 =head1 AUTHOR
 
 Vincent Pit, C<< <perl at profvince.com> >>, L<http://www.profvince.com>.
@@ -114,7 +187,7 @@ You can find documentation for this module with the perldoc command.
 
 =head1 COPYRIGHT & LICENSE
 
-Copyright 2010 Vincent Pit, all rights reserved.
+Copyright 2010,2011,2012,2013,2014,2015 Vincent Pit, all rights reserved.
 
 This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.