# coding: utf-8
"""Mixin for mapping set/getattr to self.set/get"""

#-----------------------------------------------------------------------------
#  Copyright (C) 2013 Brian Granger, Min Ragan-Kelley
#
#  This file is part of pyzmq
#
#  Distributed under the terms of the New BSD License.  The full license is in
#  the file COPYING.BSD, distributed as part of this software.
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------

from . import constants
#-----------------------------------------------------------------------------
# Code
#-----------------------------------------------------------------------------

class AttributeSetter(object):
    
    def __setattr__(self, key, value):
        """set zmq options by attribute"""
        
        # regular setattr only allowed for class-defined attributes
        for obj in [self] + self.__class__.mro():
            if key in obj.__dict__:
                object.__setattr__(self, key, value)
                return
        
        upper_key = key.upper()
        try:
            opt = getattr(constants, upper_key)
        except AttributeError:
            raise AttributeError("%s has no such option: %s" % (
                self.__class__.__name__, upper_key)
            )
        else:
            self._set_attr_opt(upper_key, opt, value)
    
    def _set_attr_opt(self, name, opt, value):
        """override if setattr should do something other than call self.set"""
        self.set(opt, value)
    
    def __getattr__(self, key):
        """get zmq options by attribute"""
        upper_key = key.upper()
        try:
            opt = getattr(constants, upper_key)
        except AttributeError:
            raise AttributeError("%s has no such option: %s" % (
                self.__class__.__name__, upper_key)
            )
        else:
            return self._get_attr_opt(upper_key, opt)

    def _get_attr_opt(self, name, opt):
        """override if getattr should do something other than call self.get"""
        return self.get(opt)
    

__all__ = ['AttributeSetter']
