How to implement `CartesianCoordinates` using `NamedTuple`?

Say I have the following code

axisnames = (:first, :second, :third, :fourth, :fifth, :sixth)

function CartesianCoordinates(t::Vararg{T, N}) where {N, T <: Real}
    NamedTuple{tuple(axisnames[1:N]...), NTuple{N, T}}((t))
end

That is, a NamedTuple can be constructed with up to 6 names. But I
want to make CartesianCoordinates a type, not a function. Because
I want to let the user just sees CartesianCoordinates when printing/showing,
not a NamedTuple. At the same time, I want it to be used as a NamedTuple,
so that I can directly use many predefined methods for NamedTuple, without writing them
myself.
In brief, what I want is a “super” type alias MyType (implemented by a PredefinedType), i.e., with a constructor, and shown as MyType itself.
How can I do that?

Here’s a first attempt with julia 1.0, the interface part may be a bit hackish though

module n3bezier
 struct point3d{T}
   x::T; 
   y::T; 
   z::T; 
   end;
##...
end;
Base.length(x::Main.n3bezier.point3d{T}) where{T} = 1;
Base.iterate(x::Main.n3bezier.point3d{T}, state = 1) where{T} = state == 1 ? ([x.x, x.y, x.z], 2) : nothing;

julia> n3bezier.point3d(1,1,1)
point3d{Int64}(1, 1, 1)