# Copyright (c) 2023 Yuki Kimoto
# MIT License

class Sys::Socket::Sockaddr::In6 extends Sys::Socket::Sockaddr : pointer {
  version_from Sys;
  use Sys::Socket::In6_addr;
  
  # Class methods
  native static method new : Sys::Socket::Sockaddr::In6 ();
  
  # Instance methods
  native method DESTROY : void ();
  
  method sa_family : int () {
    
    my $sin6_family = $self->sin6_family;
    
    return $sin6_family;
  }
  
  native method sin6_family : int ();
  
  native method set_sin6_family : void ($family : int);
  
  native method sin6_flowinfo : int ();
  
  native method set_sin6_flowinfo : void ($flowinfo : int);
  
  native method sin6_scope_id : int ();
  
  native method set_sin6_scope_id : void ($scope_id : int);
  
  native method sin6_addr : Sys::Socket::In6_addr ();
  
  native method set_sin6_addr : void ($address : Sys::Socket::In6_addr);
  
  native method sin6_port : int ();
  
  native method set_sin6_port : void ($port : int);
  
  native method size : int ();
  
  method clone : Sys::Socket::Sockaddr::In6 () {
   
    my $clone = Sys::Socket::Sockaddr::In6->new;
    
    $clone->set_sin6_family($self->sin6_family);
    $clone->set_sin6_flowinfo($self->sin6_flowinfo);
    $clone->set_sin6_scope_id($self->sin6_scope_id);
    $clone->set_sin6_addr($self->sin6_addr);
    $clone->set_sin6_port($self->sin6_port);
    
    return $clone;
  }
}