/*
 * Copyright 2004,2005 The 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.
 */

#ifndef AXIS2_PHASE_RULE_H
#define AXIS2_PHASE_RULE_H

/**
 * @file axis2_phase_rule.h
 * @brief Axis2 phase_rule interface
 */

#include <axis2_defines.h>
#include <axis2_qname.h>
#include <axis2_param.h>

#ifdef __cplusplus
extern "C"
{
#endif

    struct axis2_phase_rule;
    struct axis2_phase_rule_ops;
    
/**
 * @defgroup axis2_phase_rule Phase Rules
 * @ingroup axis2_description
 * @{
 */

/**
 *   \brief Phase Rule ops struct
 */
 AXIS2_DECLARE_DATA   typedef struct axis2_phase_rule_ops
    {        
        axis2_char_t* (AXIS2_CALL *get_before) (struct axis2_phase_rule *phase_rule, 
                                               axis2_env_t **env);
        axis2_status_t (AXIS2_CALL *set_before) (struct axis2_phase_rule *phase_rule, 
                                               axis2_env_t **env, axis2_char_t *before);
        axis2_char_t* (AXIS2_CALL *get_after) (struct axis2_phase_rule * phase_rule, 
                                               axis2_env_t **env);
        axis2_status_t (AXIS2_CALL *set_after) (struct axis2_phase_rule * phase_rule, 
                                               axis2_env_t **env, axis2_char_t *after);
        axis2_char_t* (AXIS2_CALL *get_name) (struct axis2_phase_rule * phase_rule, 
                                               axis2_env_t **env);
        axis2_status_t (AXIS2_CALL *set_name) (struct axis2_phase_rule * phase_rule, 
                                               axis2_env_t **env, const axis2_char_t *name);
        axis2_bool_t (AXIS2_CALL *is_phase_first) (struct axis2_phase_rule * phase_rule, 
                                               axis2_env_t **env);
        axis2_status_t (AXIS2_CALL *set_phase_first) (struct axis2_phase_rule * phase_rule, 
                                               axis2_env_t **env, axis2_bool_t phae_first);
        axis2_bool_t (AXIS2_CALL *is_phase_last) (struct axis2_phase_rule * phase_rule, 
                                               axis2_env_t **env);
        axis2_status_t (AXIS2_CALL *set_phase_last) (struct axis2_phase_rule * phase_rule, 
                                               axis2_env_t **env, axis2_bool_t phae_last);

        axis2_status_t (AXIS2_CALL *free) (struct axis2_phase_rule *phase_rule, 
                                           axis2_env_t **env);
        struct axis2_phase_rule* (AXIS2_CALL *clone) (struct axis2_phase_rule *phase_rule, 
                                           axis2_env_t **env);
    } axis2_phase_rule_ops_t;
	
   /** 
    * \brief Phase Rule struct
    */
    typedef struct axis2_phase_rule
    {
        /** Phase Rule related ops */
        axis2_phase_rule_ops_t *ops;
    } axis2_phase_rule_t;


/**
 * creates phase_rule struct
 */
AXIS2_DECLARE(axis2_phase_rule_t*) axis2_phase_rule_create(axis2_env_t **env, axis2_char_t *phase_name);
    
#define AXIS2_PHASE_RULE_GET_BEFORE(phase_rule, env) ((phase_rule)->ops->get_before(phase_rule, env))
#define AXIS2_PHASE_RULE_SET_BEFORE(phase_rule, env, before) ((phase_rule)->ops->set_before(phase_rule, env, before))
#define AXIS2_PHASE_RULE_GET_AFTER(phase_rule, env) ((phase_rule)->ops->get_after(phase_rule, env))
#define AXIS2_PHASE_RULE_SET_AFTER(phase_rule, env, after) ((phase_rule)->ops->set_after(phase_rule, env, after))
#define AXIS2_PHASE_RULE_GET_NAME(phase_rule, env) ((phase_rule)->ops->get_name(phase_rule, env))
#define AXIS2_PHASE_RULE_SET_NAME(phase_rule, env, name) ((phase_rule)->ops->set_name(phase_rule, env, name))
#define AXIS2_PHASE_RULE_IS_PHASE_FIRST(phase_rule, env) ((phase_rule)->ops->is_phase_first(phase_rule, env))
#define AXIS2_PHASE_RULE_SET_PHASE_FIRST(phase_rule, env, phase_first) ((phase_rule)->ops->set_phase_first(phase_rule, env, phase_first))
#define AXIS2_PHASE_RULE_IS_PHASE_LAST(phase_rule, env) ((phase_rule)->ops->is_phase_last(phase_rule, env))
#define AXIS2_PHASE_RULE_SET_PHASE_LAST(phase_rule, env, phase_last) ((phase_rule)->ops->set_phase_last(phase_rule, env, phase_last))
#define AXIS2_PHASE_RULE_FREE(phase_rule, env) ((phase_rule)->ops->free(phase_rule, env))
#define AXIS2_PHASE_RULE_CLONE(phase_rule, env) ((phase_rule)->ops->clone(phase_rule, env))
    
/** @} */
    
#ifdef __cplusplus
}
#endif

#endif    /* AXIS2_PHASE_RULE_H */
