class ReadinessHolder {
    public static final Readiness INSTANCE = new Readiness();
  }

  public static Readiness getInstance() {
    return ReadinessHolder.INSTANCE;
  }

  /**
   * Checks if the provided {@link HasMetadata} is marked as ready by the cluster.
   *
   * <p>
   * A "Readiable" resources is a subjective trait for Kubernetes Resources. Many Resources, such as ConfigMaps,
   * Secrets, etc. become ready as soon as they've been created in the cluster.
   *
   * <p>
   * However, other resources such as Pods, Endpoints, Deployments, and controllers in general, only become
   * ready when their desired state matches their actual state.
   *
   * <p>
   * This method returns true for those "Readiable" resources once they are considered ready (even if the resource
   * exists in the cluster). For "non-Readiable" resources, this method returns true once the resources are created in
   * the cluster (in addition it logs a warning stating that the given resource is not considered "Readiable").
   *
   * @param item resource to be checked for Readiness.
   * @return true if it's a Readiable Resource and is ready, or it's a non-readiable resource and has been created. false
   *         otherwise.
   */
  public boolean isReady(HasMetadata item) {
    if (isReadinessApplicable(item)) {
      return isResourceReady(item);
    } else {
      return handleNonReadinessApplicableResource(item);
    }
  }

  protected boolean isReadinessApplicable(HasMetadata item) {<FILL_FUNCTION_BODY>

    return (item instanceof Deployment ||
        item instanceof io.fabric8.kubernetes.api.model.extensions.Deployment ||
        item instanceof ReplicaSet ||
        item instanceof Pod ||
        item instanceof ReplicationController ||
        item instanceof Endpoints ||
        item instanceof Node ||
        item instanceof StatefulSet);
  
<no_super_class>