/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

package org.netbeans.modules.db.metadata.model.api;

import org.netbeans.modules.db.metadata.model.spi.ParameterImplementation;

/**
 * Encapsulates a parameter to a stored procedure or function.
 *
 * @author David Van Couvering
 */
public class Parameter extends Value {

    public enum Direction { 
        IN, OUT, INOUT;
    };

    private final ParameterImplementation impl;

    Parameter(ParameterImplementation impl) {
        super(impl);
        this.impl = impl;
    }

    public Direction getDirection() {
        return impl.getDirection();
    }

    public int getOrdinalPosition() {
        return impl.getOrdinalPosition();
    }
}
