# Path: uchroma/traits.py
# def get_args_dict(obj: HasTraits, incl_all=False):
#     """
#     Return a dict of user-configurable traits for an object
# 
#     :param obj: an instance of HasTraits
#     :param incl_all: If all items should be included, regardless of RO status
#     :return: dict of arguments
#     """
#     argsdict = ArgsDict()
#     for k in sorted(obj._trait_values.keys()):
#         v = obj._trait_values[k]
#         trait = obj.traits()[k]
#         if incl_all or (not trait.get_metadata('hidden') and is_trait_writable(trait)):
#             argsdict[k] = v
#     return argsdict
# 
# Path: uchroma/util.py
# def camel_to_snake(name: str) -> str:
#     """
#     Returns a snake_case_name from a CamelCaseName
#     """
#     s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
#     return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()


import functools
import inspect
import re
from abc import abstractmethod
from frozendict import frozendict
from traitlets import Bool, HasTraits, Instance, Tuple, Unicode
from uchroma.traits import get_args_dict
from uchroma.util import camel_to_snake
# by the Free Software Foundation, version 3.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
# License for more details.
#

# pylint: disable=protected-access, no-member, invalid-name






CUSTOM = 'custom_frame'


class BaseFX(HasTraits):

    # meta
    hidden = Bool(default_value=False, read_only=True)
    description = Unicode('_unimplemented_', read_only=True)


    def __init__(self, fxmod, driver, *args, **kwargs):
        super(BaseFX, self).__init__(*args, **kwargs)
        self._fxmod = fxmod
        self._driver = driver


# Path: uchroma/traits.py
# def get_args_dict(obj: HasTraits, incl_all=False):
#     """
#     Return a dict of user-configurable traits for an object
# 
#     :param obj: an instance of HasTraits
#     :param incl_all: If all items should be included, regardless of RO status
#     :return: dict of arguments
#     """
#     argsdict = ArgsDict()
#     for k in sorted(obj._trait_values.keys()):
#         v = obj._trait_values[k]
#         trait = obj.traits()[k]
#         if incl_all or (not trait.get_metadata('hidden') and is_trait_writable(trait)):
#             argsdict[k] = v
#     return argsdict
# 
# Path: uchroma/util.py
# def camel_to_snake(name: str) -> str:
#     """
#     Returns a snake_case_name from a CamelCaseName
#     """
#     s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
#     return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower()


# Path: uchroma/server/fx.py
import functools
import inspect
import re
from abc import abstractmethod
from frozendict import frozendict
from traitlets import Bool, HasTraits, Instance, Tuple, Unicode
from uchroma.traits import get_args_dict
from uchroma.util import camel_to_snake

# by the Free Software Foundation, version 3.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
# License for more details.
#

# pylint: disable=protected-access, no-member, invalid-name






CUSTOM = 'custom_frame'


class BaseFX(HasTraits):

    # meta
    hidden = Bool(default_value=False, read_only=True)
    description = Unicode('_unimplemented_', read_only=True)


    def __init__(self, fxmod, driver, *args, **kwargs):
        super(BaseFX, self).__init__(*args, **kwargs)
        self._fxmod = fxmod
        self._driver = driver


    @abstractmethod