'''
  This file is part of the PyPhantomJS project.

  Copyright (C) 2011 <NAME> <<EMAIL>>

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  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 General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
'''

from glob import glob
from collections import defaultdict
from os.path import dirname, split, splitext

plugins = defaultdict(list)
hook_count = {}

class Bunch(object):
    ''' Simple class to bunch a dict into
        an object that with attributes
    '''
    def __init__(self, adict):
        self.__dict__ = adict

def add_action(*hooks):
    ''' Decorator to be used for registering a function to
        a specific hook or list of hooks. 
    '''
    def register(func):
        for hook in hooks:
            plugins[hook].append(func)
        return func
    return register

def did_action(hook):
    '''Find out how many times a hook was fired'''
    return hook_count[hook]

def do_action(hook, *args, **kwargs):
    ''' Trigger a hook. It will run any functions that have registered
        themselves to the hook. Any additional arguments or keyword
        arguments you pass in will be passed to the functions.
    '''
    hook_count[hook] = 0
    for plugin in plugins[hook]:
        hook_count[hook] += 1
        plugin(*args, **kwargs)

def has_action(hook):
    '''Check if any functions have been registered for a hook'''
    if hook in plugins:
        return True
    return False

def remove_action(hook, func):
    '''Remove function that has been registered to hook'''
    if hook in plugins:
        for f in plugins[hook]:
            if f == func:
                del plugins[hook][plugins[hook].index(func)]
                return True
    return False

def remove_all_actions(hook):
    '''Remove all functions that have been registered to hook'''
    if hook in plugins:
        del plugins[hook][:]
        return True
    return False

def load_plugins():
    ''' Loads the plugins.

        Plugins must be in folders under plugins/ ,
        and must also be the same name as the plugin folder.

        E.g. a plugin folder named plugins/my_plugin will
        have my_plugin.py inside the folder called.
    '''

    # get plugin list
    plugin_list = glob('plugins/*/*.py')
    # now convert list to [('plugin_folder', 'file'), ...]
    plugin_list = [(split(dirname(f))[1], splitext(split(f)[1])[0]) for f in plugin_list]

    # initialize plugins
    for plugin in plugin_list:
        if plugin[0] == plugin[1]:
            __import__('plugins.%s.%s' % (plugin[0], plugin[1]), globals(), locals(), [], -1)

'''
  This file is part of the PyPhantomJS project.

  Copyright (C) 2011 <NAME> <<EMAIL>>

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  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 General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
'''

from glob import glob
from collections import defaultdict
from os.path import dirname, split, splitext

plugins = defaultdict(list)
hook_count = {}

class Bunch(object):
    ''' Simple class to bunch a dict into
        an object that with attributes
    '''
    def __init__(self, adict):
        self.__dict__ = adict

def add_action(*hooks):
    ''' Decorator to be used for registering a function to
        a specific hook or list of hooks. 
    '''
    def register(func):
        for hook in hooks:
            plugins[hook].append(func)
        return func
    return register

def did_action(hook):
    '''Find out how many times a hook was fired'''
    return hook_count[hook]

def do_action(hook, *args, **kwargs):
    ''' Trigger a hook. It will run any functions that have registered
        themselves to the hook. Any additional arguments or keyword
        arguments you pass in will be passed to the functions.
    '''
    hook_count[hook] = 0
    for plugin in plugins[hook]:
        hook_count[hook] += 1
        plugin(*args, **kwargs)

def has_action(hook):
    '''Check if any functions have been registered for a hook'''
    if hook in plugins:
        return True
    return False

def remove_action(hook, func):
    '''Remove function that has been registered to hook'''
    if hook in plugins:
        for f in plugins[hook]:
            if f == func:
                del plugins[hook][plugins[hook].index(func)]
                return True
    return False

def remove_all_actions(hook):
    '''Remove all functions that have been registered to hook'''
    if hook in plugins:
        del plugins[hook][:]
        return True
    return False

def load_plugins():
    ''' Loads the plugins.

        Plugins must be in folders under plugins/ ,
        and must also be the same name as the plugin folder.

        E.g. a plugin folder named plugins/my_plugin will
        have my_plugin.py inside the folder called.
    '''

    # get plugin list
    plugin_list = glob('plugins/*/*.py')
    # now convert list to [('plugin_folder', 'file'), ...]
    plugin_list = [(split(dirname(f))[1], splitext(split(f)[1])[0]) for f in plugin_list]

    # initialize plugins
    for plugin in plugin_list:
        if plugin[0] == plugin[1]:
            __import__('plugins.%s.%s' % (plugin[0], plugin[1]), globals(), locals(), [], -1)

This file is part of the PyPhantomJS project.    Copyright (C) 2011 <NAME> <<EMAIL>>    This program is free software: you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation, either version 3 of the License, or   (at your option) any later version.    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 General Public License for more details.    You should have received a copy of the GNU General Public License   along with this program.  If not, see <http://www.gnu.org/licenses/>. Simple class to bunch a dict into         an object that with attributes Decorator to be used for registering a function to         a specific hook or list of hooks. Find out how many times a hook was fired Trigger a hook. It will run any functions that have registered         themselves to the hook. Any additional arguments or keyword         arguments you pass in will be passed to the functions. Check if any functions have been registered for a hook Remove function that has been registered to hook Remove all functions that have been registered to hook Loads the plugins.          Plugins must be in folders under plugins/ ,         and must also be the same name as the plugin folder.          E.g. a plugin folder named plugins/my_plugin will         have my_plugin.py inside the folder called. # get plugin list # now convert list to [('plugin_folder', 'file'), ...] # initialize plugins