La Construcción del Objeto en Moose

  around BUILDARGS => sub {
    my $orig = shift;
    my $class = shift;

    my $self;
    if (@_ == 2) {
      return $class->$orig({ @_ }) unless ($_[0] =~ $isint and $_[1] =~ $isint);

      $self->{num} = $_[0];

      unless ($_[1]) {
        croak "Can't make a $class with demominator 0";
      }   
      $self->{den} = $_[1];
    }   
    elsif (@_ == 1) {
      if (ref $_[0]) { # Number::Fraction->new($x) y $x hashref. Lo copiamos
        if (reftype($_[0]) eq 'HASH') { 
          %$self = %{$_[0]} 
        }   
        elsif (reftype($_[0]) eq 'ARRAY') { 
         %$self = @{$_[0]}
        }
        else {
          carp "Can't make a $class from a ", ref $_[0];
        }
      } else { # Es una cadena 'num/num' o 'num'
        carp "(@_) is not a fraction"  unless $_[0] =~ $isfrac;

        $self->{num} = $1;
        $self->{den} = $3 || 1;
      }
    } # @_ == 1 
    elsif (!@_) { # no arguments
      $self->{num} = 0;
      $self->{den} = 1;
    }
    else {
      $self = { @_ };
    }

    return $class->$orig($self);
  };

  sub BUILD {
     my $self = shift;

     $self->normalise;
  }
}

Casiano Rodríguez León
Licencia de Creative Commons
Principios de Programación Imperativa, Funcional y Orientada a Objetos Una Introducción en Perl/Una Introducción a Perl
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=43.
2012-06-19