The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
MODULE = SWISH::3		PACKAGE = SWISH::3::Config	

PROTOTYPES: enable

swish_Config *
new(CLASS)
    char* CLASS;
    
    CODE:
        RETVAL = swish_config_init();
        RETVAL->ref_cnt++;
        RETVAL->stash = sp_Stash_new();
        
    OUTPUT:
        RETVAL


        
void
set_default(self)
    swish_Config *self
    
    CODE:
        swish_config_set_default(self);
        

# accessors/mutators
void
_set_or_get(self, ...)
    swish_Config *self;
ALIAS:
    set_properties          = 1
    get_properties          = 2
    set_metanames           = 3
    get_metanames           = 4
    set_mimes               = 5
    get_mimes               = 6
    set_parsers             = 7
    get_parsers             = 8
    set_aliases             = 9
    get_aliases             = 10
    set_index               = 11
    get_index               = 12
    set_misc                = 13
    get_misc                = 14
PREINIT:
    SV* RETVAL;
PPCODE:
{
    
    //warn("number of items %d for ix %d", items, ix);
    
    START_SET_OR_GET_SWITCH

    // set properties
    case 1:  croak("TODO");
             break;
             
    // get properties
    case 2:  RETVAL = sp_bless_ptr( PROPERTY_HASH_CLASS, self->properties );
             break;
             
    // set metanames
    case 3:  croak("TODO");
             break;
             
    // get metanames
    case 4:  RETVAL = sp_bless_ptr( METANAME_HASH_CLASS, self->metanames );
             break;
           
    // set mimes  
    case 5:  croak("TODO");
             break;
    
    // get mimes
    case 6:  RETVAL = sp_bless_ptr( XML2_HASH_CLASS, self->mimes );
             break;
             
    // set parsers
    case 7:  croak("TODO");
             break;
           
    // get parsers  
    case 8:  RETVAL = sp_bless_ptr( XML2_HASH_CLASS, self->parsers );
             break;
    
    // set aliases
    case 9:  croak("TODO");
             break;
             
    // get aliases
    case 10: RETVAL = sp_bless_ptr( XML2_HASH_CLASS, self->tag_aliases );
             break;
    
    // set index
    case 11: croak("TODO");
             break;
             
    // get index
    case 12: RETVAL = sp_bless_ptr( XML2_HASH_CLASS, self->index );
             break;
    
    // set misc
    case 13: croak("TODO");
             break;
             
    // get misc
    case 14: RETVAL = sp_bless_ptr( XML2_HASH_CLASS, self->misc );
             break;
        
    END_SET_OR_GET_SWITCH
}
 
void
debug(self)
    swish_Config* self
    
    CODE:
        swish_config_debug(self);
        



boolean
add(self, conf_file)
    swish_Config* self
    char* conf_file
    
    CODE:
        if (swish_config_add(self, (xmlChar*)conf_file)) {
            RETVAL = SWISH_TRUE;
        }
        else {
            RETVAL = SWISH_FALSE;
        }
    
    OUTPUT:
        RETVAL
 
      
void
delete(self, key)
    swish_Config* self
    char* key
    
    CODE:
        warn("delete() not yet implemented\n");
        

swish_Config *
read(CLASS, filename)
    char* CLASS
    char* filename
    
    CODE:
        RETVAL = swish_header_read(filename);
        RETVAL->ref_cnt++;
        RETVAL->stash = sp_Stash_new();
        
    OUTPUT:
        RETVAL


SV*
write(self, filename)
    swish_Config* self;
    char* filename;
    
    CODE:
        swish_header_write(filename, self);
        
    OUTPUT:
        filename

void
DESTROY(self)
    swish_Config* self;
    
    CODE:
        self->ref_cnt--;
               
        if (SWISH_DEBUG) {
            warn("DESTROY %s [0x%lx] [ref_cnt = %d]", 
                SvPV(ST(0), PL_na), (long)self, self->ref_cnt);
        }

        if (self->ref_cnt < 1) {
            
          sp_Stash_destroy( self->stash );
          //SWISH_WARN("set config stash to NULL");
          self->stash = NULL;
          swish_config_free( self );
          
        }