code: @Override
    public boolean isAssignableFrom( IType type )
    {
      if( isArray() && type.isArray() )
      {
        return getComponentType().isAssignableFrom( type.getComponentType() );
      }
  
      return !(isArray() || type.isArray()) && type.getAllTypesInHierarchy().contains(JavaTypes.ITYPE()) &&
             ((!(type instanceof IMetaType) && (isDefaultOrRootType() || type.isAssignableFrom(getType()) || isMetadataType())) ||
              ((type instanceof IMetaType) &&
               (isDefaultOrRootType() ||
                ((IMetaType) type).getType().equals(DEFAULT_TYPE.get()) ||
                ((IMetaType) type).getType().equals(ROOT_TYPE.get()) ||
                getType().isAssignableFrom(((IMetaType) type).getType()) ||
                StandardCoercionManager.isStructurallyAssignable(getType(), ((IMetaType) type).getType()))));
    }
docs: MetaTypes are assignable if:
  <ul>
  <li> they are both arrays and their component types are assignable
  <li> the are not arrays and:
  <li> - one of them is not a MetaType and instead implements IType
  <li> - or - one of them is the DEFAULT_TYPE
  <li> - or - one of them is the ROOT_TYPE
  <li> - or - their core types are assignable
  <li> - or - their core types are structurally assignable
  </ul>