package org.python.core;

/**
 * A __new__ function that tells its subclasses to just init if __new__ is being called on the type
 * the function was defined on. Otherwise, it just leaves initting up to the subtype otherwise.
 */
public abstract class PyOverridableNew extends PyNewWrapper {

    @Override
    public PyObject new_impl(boolean init, PyType subtype, PyObject[] args, String[] keywords) {
        if (for_type == subtype) {
            return createOfType(init, args, keywords);
        } else {
            return createOfSubtype(subtype);
        }
    }

    /**
     * Called when new is invoked on the type the new was defined on.
     *
     * @param init - if the new object should be initted.
     * @param args - args passed to call
     * @param keywords - keywords passed to call
     * @return - the new object.
     */
    public abstract PyObject createOfType(boolean init, PyObject[] args, String[] keywords);

    /** Called when new is invoked on a subtype of for_type. */
    public abstract PyObject createOfSubtype(PyType subtype);
}
