package com.yahoo.labs.samoa.moa.options;

/*
 * #%L
 * SAMOA
 * %%
 * Copyright (C) 2014 - 2015 Apache Software Foundation
 * %%
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * #L%
 */

import com.github.javacliparser.Configurable;
import com.github.javacliparser.Options;
import com.yahoo.labs.samoa.moa.MOAObject;
import com.yahoo.labs.samoa.moa.core.ObjectRepository;
import com.yahoo.labs.samoa.moa.tasks.TaskMonitor;

/**
 * Interface representing an object that handles options or parameters.
 * 
 * @author Richard Kirkby (rkirkby@cs.waikato.ac.nz)
 * @version $Revision: 7 $
 */
public interface OptionHandler extends MOAObject, Configurable {

  /**
   * Gets the purpose of this object
   * 
   * @return the string with the purpose of this object
   */
  public String getPurposeString();

  /**
   * Gets the options of this object
   * 
   * @return the options of this object
   */
  public Options getOptions();

  /**
   * This method prepares this object for use.
   * 
   */
  public void prepareForUse();

  /**
   * This method prepares this object for use.
   * 
   * @param monitor
   *          the TaskMonitor to use
   * @param repository
   *          the ObjectRepository to use
   */
  public void prepareForUse(TaskMonitor monitor, ObjectRepository repository);

  /**
   * This method produces a copy of this object.
   * 
   * @return a copy of this object
   */
  @Override
  public OptionHandler copy();

  /**
   * Gets the Command Line Interface text to create the object
   * 
   * @return the Command Line Interface text to create the object
   */
  public String getCLICreationString(Class<?> expectedType);
}
