code: Object register( Object source, String propertyName, PropertyChangedHandler handler )
  	{
  		assert source != null;
  		
  		if( source instanceof INotifyPropertyChanged )
  		{
  			DirectHandlerInfo info = new DirectHandlerInfo();
  			info.source = (INotifyPropertyChanged) source;
  			info.registrationObject = info.source.registerPropertyChangedEvent( propertyName, handler );
  			
  			return info;
  		}
  		
  		HashMap<String, ArrayList<PropertyChangedHandler>> handlersMap = PlatformSpecificProvider.get().getObjectMetadata( source );
  		if( handlersMap == null )
  		{
  			handlersMap = new HashMap<>();
  			PlatformSpecificProvider.get().setObjectMetadata( source, handlersMap );
  		}
  	
  		ArrayList<PropertyChangedHandler> handlerList = handlersMap.get( propertyName );
  		if( handlerList == null )
  		{
  			handlerList = new ArrayList<PropertyChangedHandler>();
  			handlersMap.put( propertyName, handlerList );
  		}
  	
  		handlerList.add( handler );
  	
  		HandlerInfo info = new HandlerInfo();
  		info.source = source;
  		info.propertyName = propertyName;
  		info.handler = handler;
  		
  		stats.statsAddedRegistration( info );
  		
  		return info;
  	}
docs: Registers an handler for a specific property change on an object. The object
  itself does not need to implement anything. But at least it should call the
  {@link notify(Object, String)} method when its internal property changes.
  
  @param source The object from which one wants notifications
  @param propertyName The property subscribed. You can use "*" to subscribe to all properties in one time
  @param handler
  @return