fn.closest = function(selector) {
    var parents, target, result;

    parents = jBone(selector);
    target = this[0];

    parents.some(function(parent) {
        return result = jBone.contains(parent, target);
    });

    return jBone(result);
};

fn.parents = function(selector) {
    var result = [], parents, target;

    if (selector) {
        parents = jBone(selector);

        parents.forEach(function(parent) {
            this.forEach(function(el) {
                if ((target = jBone.contains(jBone(parent), el)) && target.nodeType !== 9 && !~result.indexOf(target)) {
                    result.push(target);
                }
            });
        }, this);
    } else {
        this.forEach(function(el) {
            target = el;

            while ((target = target.parentNode) && target.nodeType !== 9) {
                if (!~result.indexOf(target)) {
                    result.push(target);
                }
            }
        });
    }

    return jBone(result);
};

fn.children = function() {
    var result = [];

    this.forEach(function(el) {
        [].forEach.call(el.childNodes, function(el) {
            if (el.nodeType !== 3) {
                result.push(el);
            }
        });
    });

    return jBone(result);
};

fn.not = function(condition) {
    var result = [];

    result = this.filter(function(el) {
        return el !== condition;
    });

    return jBone(result);
};

fn.siblings = function(includeSelf) {
    var result = [], parent;

    this.forEach(function(el) {
        if (parent = el.parentNode) {
            [].forEach.call(el.parentNode.childNodes, function(node) {
                if (includeSelf === undefined && node !== el && node.nodeType !== 3) {
                    result.push(node);
                } else if (includeSelf === true && node.nodeType !== 3) {
                    result.push(node);
                }
            });
        }
    });

    return jBone(result);
};

fn.next = function() {
    var result = [], next;

    this.forEach(function(el) {
        if (!~result.indexOf(next = el.nextElementSibling) && next) {
            result.push(next);
        }
    });

    return jBone(result);
};

fn.prev = function() {
    var result = [], previous;

    this.forEach(function(el) {
        if (!~result.indexOf(previous = el.previousElementSibling) && previous) {
            result.push(previous);
        }
    });

    return jBone(result);
};

fn.first = function() {
    return this.eq(0);
};

fn.last = function() {
    return this.eq(this.length - 1);
};

fn.index = function(element) {
    if (element instanceof jBone) {
        element = element[0];
    }

    if (element instanceof HTMLElement) {
        return this.indexOf(element);
    }
};

fn.is = function(match) {
    match = match.split(", ");

    return this.some(function(el) {
        return match.some(function(match) {
            // check visible
            if (match === ":visible") {
                return el.offsetWidth > 0 || el.offsetHeight > 0;
            }
            // check attribute
            else if (match[0] === ":") {
                return el.getAttribute(match.split(":")[1]) !== null;
            }
            // check class
            else if (match[0] === ".") {
                return el.classList.contains(match.split(".")[1]);
            }
            // check tagName
            else if (el.tagName.toLowerCase() === match) {
                return true;
            }
        });
    });
};

@@ -163,24 +163,12 @@
     
-return result = 
+if (
 jBon
@@ -189,24 +189,60 @@
 ent, target)
+)%0A            return result = parent
 ;%0A    %7D);%0A%0A 

Fix closest by returning a jBone object.