public ValueImpl(ValueDescriptorImpl<?> descriptor) {
   this.descriptor = descriptor;
   this.values = new Object[descriptor.getSize()];
   Collection<PropertyImpl> properties = descriptor.internalGetProperties();
   for (PropertyImpl property : properties) {
     values[property.getIndex()] = property.getInitializer().init();
   }
 }
        @Override
        public Object handlePropertyAccess(Object self, ValueImpl impl, Object... args) {
          ValueDescriptorImpl<?> descriptor = impl.descriptor;

          int result = 0;
          for (PropertyImpl property : descriptor.internalGetProperties()) {
            Object value = property.getGetHandler().handlePropertyAccess(self, impl);
            result += (property.getIndex() + 1) * property.getParser().hashCode(value);
          }
          return result;
        }