Have you seen Julia's type system? It is strong, and parametric on types, bitvalues, and tuples thereof. So for example Array{Int32, 2} is a 2-dimensional array of Int32.
Types are tied into multiple dispatch; so the properties are defined by the functions created for it. Moreover, JITting is type-dependent; if you call a function with a type signature, it compiles it, unless it's seen that signature before.