content: package com.comphenix.protocol.wrappers;
  
  import com.google.common.base.Preconditions;
  
  /**
   * Represents a wrapper for an NMS object.
   * @author Kristian
   */
  public abstract class AbstractWrapper {
  	protected Object handle;
  	protected Class<?> handleType;
  	
  	/**
  	 * Construct a new NMS wrapper.
  	 * @param handleType - the NMS handle type.
  	 */
  	public AbstractWrapper(Class<?> handleType) {
  		this.handleType = Preconditions.checkNotNull(handleType, "handleType cannot be NULL");
  	}
  
  	/**
  	 * Set the underlying NMS object.
  	 * @param handle - the NMS object.
  	 * @throws IllegalArgumentException If the handle is NULL.
  	 * @throws IllegalArgumentException If the handle is not assignable to {@link #getHandleType()}.
  	 */
  	protected void setHandle(Object handle) {
  		if (handle == null)
  			throw new IllegalArgumentException("handle cannot be NULL.");
  		if (!handleType.isAssignableFrom(handle.getClass()))
  			throw new IllegalArgumentException("handle (" + handle + ") is not a " + handleType + ", but " + handle.getClass());
  		this.handle = handle;
  	}
  	
  	/**
  	 * Retrieves the underlying NMS object.
  	 * @return The underlying NMS object.
  	 */
  	public Object getHandle() {
  		return handle;
  	}
  	
  	/**
  	 * Retrieve the type of the handle.
  	 * @return The type of the handle.
  	 */
  	public Class<?> getHandleType() {
  		return handleType;
  	}
  
  	@Override
  	public boolean equals(Object obj) {
  		if (obj == this) return true;
  
  		if (obj instanceof AbstractWrapper) {
  			AbstractWrapper that = (AbstractWrapper) obj;
  			return this.handle.equals(that.handle);
  		}
  
  		return false;
  	}
  
  	@Override
  	public int hashCode() {
  		return handle.hashCode();
  	}
  
  	@Override
  	public String toString() {
  		return getClass().getName() + "[handle=" + handle + "]";
  	}
  }
  