class Point3D extends Point {
  
  # Fields
  has z : rw int;
  
  # Class method
  static method new : Point3D () {
    return new Point3D;
  }
  
  # Class methods
  static method new_xyz : Point3D ($x : int, $y : int, $z : int) {
    my $self = Point3D->new;
    
    $self->set_x($x);
    $self->set_y($y);
    $self->set_z($z);
    
    return $self;
  }
  
  # Instance methods
  method clear : void () {
    $self->SUPER::clear;
    $self->{z} = 0;
  }
  
  method cloneable_clone : object () {
    my $self_clone = Point3D->new_xyz($self->x, $self->y, $self->z);
    
    return $self_clone;
  }
  
  method to_string : string () {
    my $x = $self->x;
    my $y = $self->y;
    my $z = $self->z;
    
    my $string = "($x,$y,$z)";
    
    return $string;
  }
}