def unhook(object, type=nil, method=nil)
      raise ArgumentError.new('Object method provided for a Proc') if object.is_a?(Proc) && method
      @lock.synchronize do
        case object
        when Proc
          if(type)
            @hooks[type][:procs].delete(object)
            @hooks[type].delete(:procs) if @hooks[type][:procs].empty?
          else
            @hooks.each_value do |h|
              h[:procs].delete(object)
              h.delete(:procs) if h[:procs].empty?
            end
          end
        else
          if(method.nil? && type.nil?)
            @hooks.each_value{|v|v.delete_if{|k,z| k == object.class}}
          else
            raise ArgumentError.new('Type must be provided') if type.nil?
            const = Splib.find_const(type)
            type = const unless const.nil?
            method = method.to_sym if method
            name = object.class
            raise NameError.new('Uninitialized hook type given') unless @hooks[type]
            raise StandardError.new('No hooks found for given object') unless @hooks[type][name]
            if(method)
              @hooks[type][name].delete_if{|x|x[:method] == method}
              @hooks[type].delete(name) if @hooks[type][name].empty?
            else
              @hooks[type].delete(name)
            end
          end          
        end
        @hooks.delete_if{|k,v|v.empty?}
      end
    end
def unhook(object, type=nil, method=nil)
      raise ArgumentError.new('Object method provided for a Proc') if object.is_a?(Proc) && method
      @lock.synchronize do
        case object
        when Proc
          if(type)
            @hooks[type][:procs].delete(object)
            @hooks[type].delete(:procs) if @hooks[type][:procs].empty?
          else
            @hooks.each_value do |h|
              h[:procs].delete(object)
              h.delete(:procs) if h[:procs].empty?
            end
          end
        else
          if(method.nil? && type.nil?)
            @hooks.each_value{|v|v.delete_if{|k,z| k == object.class}}
          else
            raise ArgumentError.new('Type must be provided') if type.nil?
            const = Splib.find_const(type)
            type = const unless const.nil?
            method = method.to_sym if method
            name = object.class
            raise NameError.new('Uninitialized hook type given') unless @hooks[type]
            raise StandardError.new('No hooks found for given object') unless @hooks[type][name]
            if(method)
              @hooks[type][name].delete_if{|x|x[:method] == method}
              @hooks[type].delete(name) if @hooks[type][name].empty?
            else
              @hooks[type].delete(name)
            end
          end          
        end
        @hooks.delete_if{|k,v|v.empty?}
      end
    end
object:: Object or Proc to unhook from the pipeline
 type:: Type of Objects being received
 method:: method registered to call
 Remove a hook from the pipeline. If the method and type are not
 specified, the given object will be removed from all hooks