# Path: gears/utils.py
# class cached_property(object):
# 
#     def __init__(self, func):
#         self.func = func
#         self.__name__ = func.__name__
#         self.__doc__ = func.__doc__
#         self.__module__ = func.__module__
# 
#     def __get__(self, obj, type=None):
#         if obj is None:
#             return self
#         value = obj.__dict__.get(self.__name__, missing)
#         if value is missing:
#             value = self.func(obj)
#             obj.__dict__[self.__name__] = value
#         return value


import os
import re
from .utils import cached_property
        return [self.environment.compilers.get(e) for e in self.compiler_extensions]

    @property
    def preprocessors(self):
        """The list of preprocessors used to build asset."""
        return self.environment.preprocessors.get(self.mimetype)

    @property
    def postprocessors(self):
        """The list of postprocessors used to build asset."""
        return self.environment.postprocessors.get(self.mimetype)

    @property
    def processors(self):
        """The list of all processors (preprocessors, compilers,
        postprocessors) used to build asset.
        """
        return self.preprocessors + list(reversed(self.compilers)) + self.postprocessors

    @property
    def compressor(self):
        """The compressors used to compress the asset."""
        return self.environment.compressors.get(self.mimetype)

    @cached_property
    def mimetype(self):
        """MIME type of the asset."""
        return (self.environment.mimetypes.get(self.format_extension) or
                self.compiler_mimetype or 'application/octet-stream')


# Path: gears/utils.py
# class cached_property(object):
# 
#     def __init__(self, func):
#         self.func = func
#         self.__name__ = func.__name__
#         self.__doc__ = func.__doc__
#         self.__module__ = func.__module__
# 
#     def __get__(self, obj, type=None):
#         if obj is None:
#             return self
#         value = obj.__dict__.get(self.__name__, missing)
#         if value is missing:
#             value = self.func(obj)
#             obj.__dict__[self.__name__] = value
#         return value


# Path: gears/asset_attributes.py
import os
import re
from .utils import cached_property

        return [self.environment.compilers.get(e) for e in self.compiler_extensions]

    @property
    def preprocessors(self):
        """The list of preprocessors used to build asset."""
        return self.environment.preprocessors.get(self.mimetype)

    @property
    def postprocessors(self):
        """The list of postprocessors used to build asset."""
        return self.environment.postprocessors.get(self.mimetype)

    @property
    def processors(self):
        """The list of all processors (preprocessors, compilers,
        postprocessors) used to build asset.
        """
        return self.preprocessors + list(reversed(self.compilers)) + self.postprocessors

    @property
    def compressor(self):
        """The compressors used to compress the asset."""
        return self.environment.compressors.get(self.mimetype)

    @cached_property
    def mimetype(self):
        """MIME type of the asset."""
        return (self.environment.mimetypes.get(self.format_extension) or
                self.compiler_mimetype or 'application/octet-stream')


    @cached_property